最近要实现一个公布博客性能,波及到博文中图片的保留与拜访了,在博文中图片对应:![图片形容](图片url)。由用户上传图片,咱们将其保留在 mongodb 数据库中,返回图片的 url 即可显示图片了。
在这里把根本实现步骤整顿了一下记录下来

增加 MongoDB 依赖并配置

<dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
spring:    data:        mongodb:          uri: mongodb://192.168.56.101:27017/sysblog

建设图片实体

import org.bson.types.Binary;@Documentpublic class UploadFile {    @Id    private String id;    private String name; // 文件名    private Date createdTime; // 上传工夫    private Binary content; // 文件内容    private String contentType; // 文件类型    private long size; // 文件大小     // getter/setter    }
  • 此处 id 的类型要设置为 String ,MongoDB 会主动调配 id ,设置为数值型会报错。
  • BSON 是一个二进制序列化格局,在MongoDB外面被用来做文档存储和近程程序调用,咱们应用 org.bson.types.Binary 类来封装文件内容。new Binary(byte[] byte)

上传图片

此处仅演示性能,便不分层等操作。

上传图片后,保留至 mongodb 数据库,并返回图片的拜访 url
@Autowiredprivate MongoTemplate mongoTemplate;@PostMapping("/file/uploadImage")@ResponseBodypublic String uploadImage(@RequestParam(value = "image") MultipartFile file){    if(file.isEmpty())            return JSONResult.build(200, "请抉择一张图片", null);    // 返回的 JSON 对象,这品种可本人封装    JSONResult jsonResult = null;    String fileName = file.getOriginalFilename();    try {        UploadFile uploadFile = new UploadFile();        uploadFile.setName(fileName);        uploadFile.setCreatedTime(new Date());        uploadFile.setContent(new Binary(file.getBytes()));        uploadFile.setContentType(file.getContentType());        uploadFile.setSize(file.getSize());        UploadFile savedFile = mongoTemplate.save(uploadFile);        String url = "http://localhost:8080/file/image/"+ savedFile.getId();        jsonResult =  JSONResult.build(200, "图片上传胜利", url);    } catch (IOException e) {        e.printStackTrace();        jsonResult =  JSONResult.build(500, "图片上传失败", null);    }    return jsonResult;}
  • MongoTemplate:操作 MongoDB 的类,例如增删改查等。

    你也能够创立一个 repository 层接口继承 MongoRepository,相似于 JPA 的操作。

  • JSONResult:本人封装的返回 JSON 数据的工具类:

    JSONResult(状态码, 信息, 数据);

  • String url:咱们获取保留到数据库中的图片 id ,封装成拜访图片的地址,其实也是一个申请,上面咱们实现这个申请。

获取图片

依据图片 id 获取图片
import org.springframework.http.MediaType;@GetMapping(value = "/file/image/{id}", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})@ResponseBodypublic byte[] image(@PathVariable String id){    byte[] data = null;    UploadFile file = mongoTemplate.findImageById(id, UploadFile.class);    if(file != null){        data = file.getContent().getData();    }    return data;}
  • produces:示意返回给前端的类型,比方文本、GIF、PDF 等等,这里咱们当然返回图片了。

后果

在 markdown 编辑器中插入图片,几乎完满: