MongoDB 上传下载图片 -- MongoTemplate

1、引入jar包

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>

2、yml 配置文件

spring:
  data:
    mongodb:
      uri: mongodb://192.168.124.217:27017/DocDB

# 这里 DocDB 是自己在mongoDB中创建的数据库,该配置是MongoDB无密码条件下的配置      
# spring.data.mongodb.uri=mongodb://name:pass@localhost:27017/test,其中name是用户名,pass是密码

3、创建实体

package com.zimmur.manager.service.dto;

import org.bson.types.Binary;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.io.Serializable;
import java.util.Date;

/**
 * @ClassName: UploadFile
 * @Description: 文件上传实体类
 * @author: 
 * @Date:2020/5/30 
 **/
@Document
public class UploadFile implements Serializable {
    
    

    @Id
    private String pictureGuid;
    private String name; // 文件名
    private Date createdTime; // 上传时间
    private Binary content; // 文件内容
    private String contentType; // 文件类型
    private long size; // 文件大小



    public String getName() {
    
    
        return name;
    }

    public Date getCreatedTime() {
    
    
        return createdTime;
    }

    public Binary getContent() {
    
    
        return content;
    }

    public String getContentType() {
    
    
        return contentType;
    }

    public long getSize() {
    
    
        return size;
    }

    public String getPictureGuid() {
    
    
        return pictureGuid;
    }

    public void setPictureGuid(String pictureGuid) {
    
    
        this.pictureGuid = pictureGuid;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public void setCreatedTime(Date createdTime) {
    
    
        this.createdTime = createdTime;
    }

    public void setContent(Binary content) {
    
    
        this.content = content;
    }

    public void setContentType(String contentType) {
    
    
        this.contentType = contentType;
    }

    public void setSize(long size) {
    
    
        this.size = size;
    }

}

package com.zimmur.manager.service.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

/**
 * @ClassName: BatchUploadRequest
 * @Description:用于批量上传接口
 * @author: 
 * @Date:
 **/
@ApiModel(description = "图片批量上传请求实体")
public class BatchUploadRequest implements Serializable {
    
    

   @ApiModelProperty(value = "图片文件")
   @NotNull
   private MultipartFile file;

   @ApiModelProperty(value = "图片文件名")
   @Valid
   @NotNull
   @NotEmpty
   private String fileName;


    public MultipartFile getFile() {
    
    
        return file;
    }

    public String getFileName() {
    
    
        return fileName;
    }

    public void setFile(MultipartFile file) {
    
    
        this.file = file;
    }

    public void setFileName(String fileName) {
    
    
        this.fileName = fileName;
    }
}

4、控制层

package com.zimmur.manager.web.rest;

import com.zimmur.manager.service.dto.BatchUploadRequest;
import com.zimmur.manager.service.dto.UploadFile;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.bson.types.Binary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

/**
 * @ClassName: FileUploadController
 * @Description:
 * @author: 
 * @Date:2020/6/1 
 **/
@Api(tags = "文件上传")
@Controller
@RequestMapping(value = "/api", produces = {
    
     MediaType.APPLICATION_JSON_VALUE })
public class FileUploadResource {
    
    

    private final Logger log = LoggerFactory.getLogger(FileUploadResource.class);

    private static final String ENTITY_NAME = "fileUpload";

    private final MongoTemplate mongoTemplate;


    public FileUploadResource(MongoTemplate mongoTemplate) {
    
    
        this.mongoTemplate = mongoTemplate;
    }

     
    @RequestMapping(value = "/doUpload",produces = {
    
     MediaType.APPLICATION_JSON_VALUE })
    @ResponseBody
    @ApiOperation(value = "图片上传", httpMethod = "POST", notes = "文件上传")
    public ResponseEntity<List<Map<String,String>>> doUploadFile(
        @RequestParam("file") MultipartFile file,
        @ApiParam(name = "fileName", value = "文件名", required = true) @RequestParam("fileName") String fileName
    ) {
    
    
        log.debug("REST request to doUpload  : {}", fileName);
        /** 上传 mongoDb,MongoDB 上传时会自己生成一个ID,这里采用自定义的ID **/
        String pictureGuid = UUID.randomUUID().toString().replaceAll("-","");
        byte[] buffer = null;
        try {
    
    
            UploadFile uploadFile = new UploadFile();
            // 这里的文件名可以通过 file参数获取,但是该接口采用前端传参方式。
            // file.getOriginalFilename()
            uploadFile.setName(fileName);
            uploadFile.setCreatedTime(new Date());
            uploadFile.setContent(new Binary(file.getBytes()));
            uploadFile.setContentType(file.getContentType());
            uploadFile.setSize(file.getSize());
            uploadFile.setPictureGuid(pictureGuid);  // 自定义id
            UploadFile savedFile = mongoTemplate.save(uploadFile);
            List<Map<String,String>> maps = new ArrayList<>();
            Map<String, String> map = new HashMap<>();
            map.put("fileUrl","/api/image/"+pictureGuid);
            map.put("fileName", fileName);
            maps.add(map);
            if (savedFile != null ) return ResponseEntity.ok(maps);
            else return ResponseEntity.status(400).body(null) ;
        } catch (IOException e) {
    
    
            log.error("REST request to doUpload fail:",e);
            return ResponseEntity.status(400).body(null) ;
        }
    }


    @RequestMapping(value = "/batchUpload",produces = {
    
     MediaType.APPLICATION_JSON_VALUE })
    @ResponseBody
    @ApiOperation(value = "图片批量上传", httpMethod = "POST", notes = "文件上传")
    public ResponseEntity<List<Map<String,String>>> batchUpload(
        @Valid @RequestBody List<BatchUploadRequest> batchUploadRequestList
        ) {
    
    
        log.debug("REST request to batchUpload  : {}", batchUploadRequestList);
        List<Map<String,String>> maps = new ArrayList<>();
        List<UploadFile> addUploadFiles = new ArrayList<>();
        try {
    
    
            for (BatchUploadRequest obj : batchUploadRequestList) {
    
    
                Map<String, String> map = new HashMap<>();
                String pictureGuid = UUID.randomUUID().toString().replaceAll("-","");
                    MultipartFile file = obj.getFile();
                    UploadFile uploadFile = new UploadFile();
                    uploadFile.setName(obj.getFileName());
                    uploadFile.setCreatedTime(new Date());
                    uploadFile.setContent(new Binary(file.getBytes()));
                    uploadFile.setContentType(file.getContentType());
                    uploadFile.setSize(file.getSize());
                    uploadFile.setPictureGuid(pictureGuid);  // 自定义id
                    //UploadFile savedFile = mongoTemplate.save(uploadFile);
                    addUploadFiles.add(uploadFile);
                    map.put("fileName", obj.getFileName());
                    map.put("fileUrl","/api/image/"+pictureGuid);
                    maps.add(map);
            }
            /** mongoDB 批量上传 **/
            List<UploadFile> result = mongoTemplate.save(addUploadFiles);
            if (result != null && !result.isEmpty())
                return ResponseEntity.ok(maps);

        } catch (IOException e) {
    
    
            log.error("REST request to batchUpload fail:",e);
        }
        return ResponseEntity.status(400).body(null) ;
    }


    @GetMapping(value = "/getImageByte/{pictureGuid}", produces = {
    
    MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    @ResponseBody
    public ResponseEntity<byte[]> getImageByte(@PathVariable String pictureGuid){
    
    
        log.debug("REST request to getImage : {}", pictureGuid);
        /** mongoDB 获取图片信息 **/
        byte[] data = null;
        UploadFile file = mongoTemplate.findById(pictureGuid,UploadFile.class);
        if(file != null) data = file.getContent().getData();
        else return ResponseEntity.notFound().build();
        return ResponseEntity.ok().body(data);
    }


   // @GetMapping(value = "/imag/{pictureGuid}", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
    @GetMapping(value = "/image/{pictureGuid}", produces = {
    
    "application/octet-stream"})
    @ResponseBody
    public void getImage(HttpServletResponse response,@PathVariable String pictureGuid)throws Exception{
    
    
        log.debug("REST request to getImage : {}", pictureGuid);
        /** mongoDB 获取图片信息 **/
        OutputStream outputStream = null;
        UploadFile file = mongoTemplate.findById(pictureGuid,UploadFile.class);
        byte[] data = file.getContent().getData();
        try {
    
    
            outputStream = response.getOutputStream();
            response.setContentType(file.getContentType());
            outputStream.write(data);
            outputStream.flush();
        } catch (Exception e) {
    
    
            log.error("REST request to image fail:",e);
        } finally {
    
    
            try {
    
    
                outputStream.close();
            } catch (IOException e) {
    
    
                log.error("REST request to image fail:",e);
            }
        }


    }



}

5、测试

5.1 上传测试

 
采用 swagger API 来测试:

在这里插入图片描述

调用接口返回结果:

在这里插入图片描述

**在MongoDB 可视化工具 Studio 3T 中可以看到刚刚上传的文件信息,其中图片文件是以二进制byte[]存储。**
在这里插入图片描述

5.2 下载测试

 
调用 /api/image 接口,这里的请求参数是上传时返回的数据。
 
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41922349/article/details/106518180