MongoDB数据库操作文件上传下载的工具类:
(MongoDB数据库的集合名类似SQL中的表)
import com.mongodb.DB;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
/**
* MongoDB数据库文件操作工具类
* @author lyk
* @date 2018-7-20
*/
public class MongoDBFileUtils {
/**
* @Describe: 保存文件到指定MongoDB的集合中
* @param multipartFile 文件对象
* @param collectionName 集合名,相当于Sql的表
* @param mongoTemplate
* @return 新文件名(唯一ID)
*/
public static String saveFile(MultipartFile multipartFile, String collectionName,MongoTemplate mongoTemplate) throws IOException {
//获取文件原始名称
String originalFilename = multipartFile.getOriginalFilename();
// 获取文件后缀名
String ext = originalFilename.substring(originalFilename.lastIndexOf("."));
//设置新名称(UUID唯一)
String newName = UUID.randomUUID().toString().replace("-","")+ext;
//创建临时文件对象,把MultipartFile转换成File类型
File tempFile =File.createTempFile("temp",ext);
multipartFile.transferTo(tempFile);
//获取MongoDB数据库对象
DB db = mongoTemplate.getDb();
// 获取该数据库的集合的GFS
GridFS gridFS = new GridFS(db,collectionName);
//创建该集合的GFS对象
GridFSInputFile gridFSInputFile = gridFS.createFile(tempFile);
//为filename属性赋值
gridFSInputFile.put("filename", newName);
//为contentType属性赋值
gridFSInputFile.put("contentType",ext);
//执行保存
gridFSInputFile.save();
//返回新文件名(唯一)
return newName;
}
/**
* @Desc 获取GridFSDBFile文件
* @param fileName
* @param collectionName
* @param mongoTemplate
*/
public static GridFSDBFile getGfsFile(String fileName,String collectionName,MongoTemplate mongoTemplate) {
//获取MongoDB数据库对象
DB db = mongoTemplate.getDb();
//获取该数据库的集合的GFS
GridFS gridFS = new GridFS(db,collectionName);
//根据唯一的文件名获取GFS文件对象
GridFSDBFile gridFSDBFile = gridFS.findOne(fileName);
return gridFSDBFile;
}
/**
* @Desc 把GridFSDBFile对象输出到页面
* @param gridFSDBFile
* @param response
*/
public static void outPutGfsFile(GridFSDBFile gridFSDBFile,HttpServletResponse response) throws IOException {
if (gridFSDBFile != null) {
OutputStream sos = response.getOutputStream();
response.setContentType("application/octet-stream");
// 获取原文件名
String name = (String) gridFSDBFile.get("filename");
String newFileName = new String(name.getBytes("GBK"), "ISO8859-1");
// 设置下载文件名
response.addHeader("Content-Disposition", "attachment; filename=\"" + newFileName + "\"");
// 向客户端输出文件
gridFSDBFile.writeTo(sos);
sos.flush();
sos.close();
}
}
/**
* 根据文件名ID和集合名获取文件,并向页面输出
* @param fileName
* @param collectionName
* @param response
* @param mongoTemplate
* @throws IOException
*/
public static void outFile(String fileName,String collectionName,HttpServletResponse response,MongoTemplate mongoTemplate) throws IOException {
GridFSDBFile gridFSDBFile = getGfsFile(fileName,collectionName,mongoTemplate);
outPutGfsFile(gridFSDBFile,response);
}
}
Controller示例:
@Controller
@RequestMapping("noticeManage")
public class NoticeManageController {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 把富文本编辑器里的图片保存到MongoDB数据库
* @param content_image
* @return
*/
@RequestMapping("fileUpload")
@ResponseBody
public HashMap fileUpload(MultipartFile content_image) {
HashMap map = new HashMap();
try {
String fileName = MongoDBFileUtils.saveFile(content_image, "content_image", mongoTemplate);
String path = "/noticeManage/showContentImage?fileName="+fileName;
map.put("path",path);
return map;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* @Description 从mongodb中获取图片
* @param fileName 文件名
* @param response
* @author Liuyukang
* @Date 2018-7-9
*/
@RequestMapping(value = "showContentImage")
public void showImageLarge(String fileName,HttpServletResponse response) {
try {
MongoDBFileUtils.outFile(fileName,"content_image",response,mongoTemplate);
} catch (IOException e) {
e.printStackTrace();
}
}
JS示例(summernote富文本编辑器里的图片上传和回显):