前言
之前系统的附件都是直接存在磁盘中的,最近想把附件存放在数据库中,但是想了一下直接存在关系数据库中,如果附件数据量大的情况下存取可能会存在一些问题,从网上看了下有存放MongoDB中的,我也大概试了一下,下边就把上传下载MongoDB中的附件的方法写了一下,做一个备忘,也和大家交流一下。
上传
首先引用MongoDB
@Resource
private GridFsTemplate gridFsTemplate;
@RequestMapping("upload")
public void upload(ModelMap modelMap,HttpServletRequest request, HttpServletResponse)throws Exception {
PrintWriter out = response.getWriter();
String fileId = MongoFileUtil.getIdAfterUpload(gridFsTemplate, request, response);
out.print(fileId);
out.flush();
out.close();
}
public static String getIdAfterUpload(GridFsTemplate gridFsTemplate,HttpServletRequest request, HttpServletResponse response) throws Exception{
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;//将HTTP请求转换为多文件上传请求
String fileName = null;//变量请求获取文件名称
while (multipartRequest.getFileNames().hasNext()) {// 获取文件名
fileName = multipartRequest.getFileNames().next();
break;
}
//获取文件本身
CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
.getFile(fileName);// 此处的getFile(fileName为页面上表单里面文的name属性)
//真实的上传的文件名 ,需要保存
String uploadFileName = file.getOriginalFilename();
//获取文件的contentType
String contentType = file.getContentType();
//自生成一个Id作为文件的唯一索引
String fileId =String.valueOf(UniqueIdUtil.genId()) ;
//将系统生成的文件ID放入DBMeta,以便根据文件ID查询
DBObject dbObject = new BasicDBObject();
dbObject.put("fileId", fileId);
gridFsTemplate.store(file.getInputStream(),uploadFileName, contentType, dbObject);
return fileId;
}
下载
@RequestMapping("download")
public void download(ModelMap modelMap,String fileId, HttpServletRequest request, HttpServletResponse response) throws Exception{
MongoFileUtil.download(gridFsTemplate, fileId, request,response);
}
public static void download(GridFsTemplate gridFsTemplate,String fileId,HttpServletRequest request, HttpServletResponse response) throws Exception{
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
DBObject dbObject = new BasicDBObject();
dbObject.put("fileId", fileId);
Query query = new Query(Criteria.where("metadata").is(dbObject));
GridFSDBFile dbFile = gridFsTemplate.findOne(query);
response.setContentType(dbFile.getContentType());
response.setHeader("Content-disposition", "attachment; filename="
+ URLEncoder.encode(dbFile.getFilename(), "utf-8"));
response.setContentLength((int)dbFile.getLength());
bis = new BufferedInputStream(dbFile.getInputStream());
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}