当前位置:   article > 正文

MongoDB GridFS文件上传下载_mongo chunk下载

mongo chunk下载

MongoDB GridFS支持大文件存储:

GridFS用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等);

GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中;

GridFS 可以更好的存储大于16M的文件;

GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中;

每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

spring-boot-starter-data-mongodb 基于GridFS实现文件的上传下载

application配置文件

  1. server:
  2. port: 9001
  3. spring:
  4. data:
  5. mongodb:
  6. uri: mongodb://root:123456@127.0.0.1:27017/fileInfo?readPreference=secondary&authSource=admin
  7. jackson:
  8. default-property-inclusion: non_null
  9. servlet:
  10. multipart:
  11. max-file-size: 10MB #单个文件上传大小
  12. max-request-size: 100MB #单次请求文件上传大小
  13. http:
  14. encoding:
  15. charset: UTF-8

 

自定义实体类记录上传文件的相关信息

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Document(collection = "tbl_data_record")
  5. public class FileMetaDomain implements Serializable {
  6. private static final long serialVersionUID = 7733095063283270367L;
  7. @Id
  8. private String id;
  9. /* 文件信息存储在数据库中的uuid */ private List<Object> fileIds;
  10. /* 源文件名 */ private String fileName;
  11. /* 文件类型 */ private String contentType;
  12. /* 文件大小 */ private long size;
  13. /* 更新日期 */ private LocalDate updateTime = LocalDate.now();
  14. /* 创建日期 */ private LocalDate createTime = LocalDate.now();
  15. public FileMetaDomain(String id, String fileName, String contentType, long size){
  16. this.id = id; this.fileName = fileName;
  17. this.contentType = contentType;this.size = size;
  18. }
  19. }

Dao层接口

  1. @Repository
  2. public interface GridFSRepository extends MongoRepository<FileMetaDomain,String> {
  3. @Query("{'fileName': ?0}")
  4. FileMetaDomain findByFileName(String fileName);
  5. }

Service逻辑处理

  1. public interface GridFsService {
  2. String saveFile(MultipartFile file) throws IOException;
  3. void downLoad(HttpServletResponse response, String fileName);
  4. }

实现类

  1. @Slf4j
  2. @Service
  3. public class GridFSServiceImpl implements GridFsService {
  4. private final MongoTemplate mongoTemplate;
  5. private final GridFSRepository repository;
  6. private final GridFsTemplate gridFsTemplate;
  7. @Autowired
  8. public GridFSServiceImpl(GridFSRepository repository, MongoTemplate mongoTemplate, GridFsTemplate gridFsTemplate) {
  9. this.repository = repository;
  10. this.mongoTemplate = mongoTemplate;
  11. this.gridFsTemplate = gridFsTemplate;
  12. }
  13. @Override
  14. public String saveFile(MultipartFile file) throws IOException {
  15. //源文件名
  16. String originalFilename = file.getOriginalFilename();
  17. //文件类型
  18. String contentType = file.getContentType();
  19. //文件大小
  20. long size = file.getSize();
  21. MongoDatabase db = mongoTemplate.getDb();
  22. GridFSBucket gridFSBucket = GridFSBuckets.create(db);
  23. ObjectId objectId = gridFSBucket.uploadFromStream(originalFilename, file.getInputStream());
  24. FileMetaDomain fileMetaDomain = new FileMetaDomain(objectId.toString(),originalFilename,contentType,size);
  25. FileMetaDomain fileMeta = repository.save(fileMetaDomain);
  26. return fileMeta.getId();
  27. }
  28. @Override
  29. public void downLoad(HttpServletResponse response, String fileName){
  30. FileMetaDomain fileMetaDomain = repository.findByFileName(fileName);
  31. Assert.notNull(fileMetaDomain,"当前下载的文件未上传到服务器");
  32. Query query = new Query();
  33. query.addCriteria(Criteria.where("filename").is(fileName));
  34. GridFSFile file = gridFsTemplate.findOne(query);
  35. MongoDatabase db = mongoTemplate.getDb();
  36. try {
  37. //文件名转码,支持中文文件名下载
  38. fileName = URLEncoder.encode(fileName,"UTF-8");
  39. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  40. response.setHeader("Content-Disposition","attachment;filename="+fileName);
  41. ServletOutputStream outputStream = response.getOutputStream();
  42. GridFSBuckets.create(db).downloadToStream(file.getObjectId(),outputStream);
  43. outputStream.flush();
  44. outputStream.close();
  45. }catch (Exception e){
  46. e.printStackTrace();
  47. }
  48. }
  49. }

文件上传下载接口

  1. @Slf4j
  2. @RestController
  3. @RequestMapping("/file")
  4. public class GridFSController {
  5. private final GridFsService service;
  6. @Autowired
  7. public GridFSController(GridFsService service) {
  8. this.service = service;
  9. }
  10. @PostMapping("/upload")
  11. @ResponseBody
  12. public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file){
  13. try {
  14. if(ObjectUtils.isEmpty(file)){
  15. return ResponseEntity.ok().body("上传文件不能为空");
  16. }else {
  17. return ResponseEntity.ok().body(service.saveFile(file));
  18. }
  19. }catch (Exception e){
  20. log.error("[Upload Failed]",e);
  21. return ResponseEntity.badRequest().body(e.getMessage());
  22. }
  23. }
  24. @GetMapping("/download")
  25. public ResponseEntity<String> download(HttpServletResponse response, @RequestParam("fileName")String fileName){
  26. try {
  27. service.downLoad(response,fileName);
  28. return ResponseEntity.ok().body("SUCCESS");
  29. }catch (Exception e){
  30. log.error("[Download Failed]",e.getMessage());
  31. return ResponseEntity.badRequest().body(e.getMessage());
  32. }
  33. }
  34. }

 

 

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/220854
推荐阅读
  

闽ICP备14008679号