优秀的编程知识分享平台

网站首页 > 技术文章 正文

MongoDB上传下载附件方法(mongodb上传文件)

nanyue 2024-08-01 22:51:07 技术文章 7 ℃

前言

之前系统的附件都是直接存在磁盘中的,最近想把附件存放在数据库中,但是想了一下直接存在关系数据库中,如果附件数据量大的情况下存取可能会存在一些问题,从网上看了下有存放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();

}

}

Tags:

最近发表
标签列表