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 接口,这里的请求参数是上传时返回的数据。