GridFSBucket SpringBoot MongoDB存取文件代码记录

spring-boot-starter-data-mongodb(2.1.1.RELEASE)、hutool(4.6.1)、lombok

在@Configuration注解类下配置GridFSBucket

    @Autowired
    private MongoDbFactory mongoDbFactory;

    @Bean
    public GridFSBucket getGridFSBuckets() {
        MongoDatabase db = mongoDbFactory.getDb();
        return GridFSBuckets.create(db);
    }

application.yml

spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: test   

mongodb 涉及集合fs.chunksfs.files

import lombok.extern.slf4j.Slf4j;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import org.bson.types.ObjectId;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@RequestMapping("/login")
@RestController
public class BaseController {
  	@Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private GridFsTemplate gridFsTemplate;
    @Resource
    private GridFSBucket gridfsbucket;

    /**
     * 上传图片文件
     * @param file 上传文件
     * @return 图片文件id
     * @throws IOException
     */
    @PostMapping("/gridFs")
    public String contextLoads(@RequestParam(value = "image") MultipartFile file) throws IOException {
        //向Girdfs存储文件
        ObjectId objectId = gridFsTemplate.store(file.getInputStream(), file.getOriginalFilename(), StandardCharsets.UTF_8);
        return objectId.toString();
    }

 	/**
     * 返回图片 其他类型的文件 可以指定其余MediaType
     * @param id 图片id
     * @return byte[]
     */
    @GetMapping(value = "/gridFs/{id}", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE, MediaType.IMAGE_GIF_VALUE})
    public byte[] gridFs1(@PathVariable String id) {

        GridFSDownloadStream downloadStream = null;
        InputStream inputStream = null;
        try {
            //根据id查询文件
            GridFSFile gridfsfile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
            if (ObjectUtil.isNotNull(gridfsfile)) {
                //打开流下载对象
                downloadStream = gridfsbucket.openDownloadStream(gridfsfile.getObjectId());
                //获取流对象
                GridFsResource gridFsResource = new GridFsResource(gridfsfile, downloadStream);
                //获取数据
                inputStream = gridFsResource.getInputStream();
                //可保存到文件到服务器
                //FileUtil.writeFromStream(inputStream, "E:\\FFOutput\\" + gridfsfile.getFilename());
                return IoUtil.readBytes(inputStream);
            }
        } catch (Exception e) {
            log.error("XXX", e);
        } finally {
            IoUtil.close(inputStream);
            IoUtil.close(downloadStream);
        }
        //可以返回默认图片流
        return null;
    }

 	/**
     * 返回图片浏览器下载
     * @param id 图片id
     * @return ResponseEntity<byte[]>
     */
    @GetMapping(value = "/gridFsDownload/{id}")
    public ResponseEntity<byte[]> gridFs(@PathVariable String id) {
        GridFSDownloadStream downloadStream = null;
        InputStream inputStream = null;
        HttpHeaders headers1 = new HttpHeaders();
        MediaType mediaType = new MediaType("text", "html", StandardCharsets.UTF_8);
        headers1.setContentType(mediaType);
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<>("下载失败".getBytes(), headers1, HttpStatus.CREATED);
        try {
            //根据id查询文件
            GridFSFile gridfsfile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(id)));
            if (ObjectUtil.isNotNull(gridfsfile)) {
                //打开流下载对象
                downloadStream = gridfsbucket.openDownloadStream(gridfsfile.getObjectId());
                //获取流对象
                GridFsResource gridFsResource = new GridFsResource(gridfsfile, downloadStream);
                //获取数据
                inputStream = gridFsResource.getInputStream();
                // 通知浏览器进行文件下载
                String fileName = URLEncoder.encode(gridfsfile.getFilename(), StandardCharsets.UTF_8.name());
                HttpHeaders headers = new HttpHeaders();
                headers.add("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
                headers.add("content-length", String.valueOf(gridfsfile.getLength()));
                responseEntity = new ResponseEntity<>(IoUtil.readBytes(inputStream), headers, HttpStatus.OK);
            }
        } catch (IOException e) {
            log.error("XXX", e);
            return responseEntity;
        } finally {
            IoUtil.close(inputStream);
            IoUtil.close(downloadStream);
        }
        return responseEntity;
    }
}
Spring Boot使用MongoDB存取文件的步骤如下: 1.在全局配置文件(application.properties或application.yml)中配置MongoDB的连接信息,包括主机、端口和数据库名称。例如: ``` spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.port=27017 spring.data.mongodb.database=users ``` 2.在项目的pom.xml文件中引入MongoDB的启动器依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 3.创建一个实体类来表示文件的数据结构,例如Blog类。可以根据需求设置相应的属性,比如作者、标题、内容、评论等: ``` package com.hang.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @Data @NoArgsConstructor @AllArgsConstructor public class Blog { private String id; private String author; private String title; private String content; private String communication; private int likeNumbers; private Date commitTime; } ``` 4.在需要使用MongoDB进行文件存取的地方,创建MongoClient对象,并通过它获取MongoDatabase对象。然后,可以通过MongoDatabase来获取MongoCollection对象,并使用其提供的方法进行文件的增删改查操作。例如,在测试类中的方法中,可以实现文件的插入操作: ``` import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class Springboot09MongodbApplicationTests { @Test void contextLoads() { MongoClient mongoClient = null; try { mongoClient = MongoClients.create("mongodb://127.0.0.1:27017"); MongoDatabase users = mongoClient.getDatabase("users"); MongoCollection<Document> test = users.getCollection("test"); test.insertOne(new Document("name","小红")); System.out.println("数据库连接成功,并成功插入数据"); }catch (Exception e){ e.printStackTrace(); }finally { mongoClient.close(); } } } ``` 通过以上步骤,就可以在Spring Boot中使用MongoDB进行文件存取了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Springboot集成MongoDB存储文件、读取文件](https://blog.csdn.net/harlan95/article/details/130154710)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Springboot整合Mongodb](https://blog.csdn.net/continue_gdufe/article/details/123936405)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值