前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB-4 GridFS 文件存储

MongoDB-4 GridFS 文件存储

作者头像
风间影月
发布2020-03-05 10:14:04
1.1K0
发布2020-03-05 10:14:04
举报
文章被收录于专栏:BeJavaGod

1. 配置config

代码语言:javascript
复制
spring:
  data:
    mongodb:
      uri: mongodb://username:password@192.168.2.72:27017
      database: mydb
代码语言:javascript
复制
@Component
public class WebConfig {
    @Value("${spring.data.mongodb.database}")
    private String mongodb;

    @Bean
    public GridFSBucket getGridFSBucket(MongoClient mongoClient){
        MongoDatabase database = mongoClient.getDatabase(mongodb);
        GridFSBucket bucket = GridFSBuckets.create(database);
        return bucket;
    }

}

2. 基于gridfs的上传,读取与下载

代码语言:javascript
复制
@Autowired
    private GridFSBucket gridFSBucket;


    /**
     * 创建文件到GirdFS
     * @param model
     * @return
     * @throws Exception
     */
    @GetMapping("/addToGridFS")
    @ResponseBody
    public Object addToGirdFS(Model model) throws Exception {

        // 声明freemarker的配置类
        Configuration cfg = new Configuration(Configuration.getVersion());
        // 声明freemarker模板所需要加载的目录位置
        String classpath = this.getClass().getResource("/").getPath();
        cfg.setDirectoryForTemplateLoading(new File(classpath + "templates"));
//        System.out.println(classpath + "templates");

        // 构建数据
        model = makeModel(model);

        // 加载ftl模板
        Template template = cfg.getTemplate("user.ftl", "utf-8");
        // 获得静态化后的内容
        String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, model.asMap());

        InputStream inputStream = IOUtils.toInputStream(htmlContent);

        // 上传
        ObjectId fileId = gridFSBucket.uploadFromStream("1001.html", inputStream);
        System.out.println("上传完成。文件ID:" + fileId);

        // 文件在mongodb中的id
        return fileId.toString();
    }


    /**
     * 读取文件
     * @param model
     * @return
     * @throws Exception
     */
    @GetMapping("/readGridFS")
    @ResponseBody
    public String readGridFS(Model model) throws Exception {

        // 获取文件ID
        String objectId = "5e42924980fb940ab75f141a"; // 根据upload后文件ID修改
        // 获取内容
        GridFSFindIterable gridFSFindIterable = gridFSBucket.find(Filters.eq("_id", new ObjectId(objectId)));
        GridFSFile gridFSFile = gridFSFindIterable.first();
        System.out.println("filename: " + gridFSFile.getFilename());

        return gridFSFile.getFilename();
    }

    /**
     * 从gridfs中下载文件
     * @throws Exception
     */
    @GetMapping("/downloadGridFS")
    @ResponseBody
    public String downloadGridFS() throws Exception {
        // 获取文件ID
        String objectId = "5e42924980fb940ab75f141a";
        // 获取文件流,定义存放位置和名称
        File file = new File(htmlTarget + "/1001.html");
        // 创建输出流
        OutputStream os = new FileOutputStream(file);
        // 执行下载
        gridFSBucket.downloadToStream(new ObjectId(objectId), os);
        System.out.println("下载成功");
        return "ok";
    }
    @GetMapping("/downloadGridFSByFileName")
    @ResponseBody
    public String downloadGridFSByFileName() throws Exception {
        // 获取文件ID
        String filename = "1001.html";
        // 获取文件流,定义存放位置和名称
        File file = new File(htmlTarget + "/" + filename);
        // 创建输出流
        OutputStream os = new FileOutputStream(file);
        // 执行下载
        gridFSBucket.downloadToStream(filename, os);
        System.out.println("下载成功");
        return "ok";
    }

    /**
     * 删除文件
     * @param model
     * @return
     * @throws Exception
     */
    @GetMapping("/deleteGirdFS")
    @ResponseBody
    public String deleteGirdFS(Model model) throws Exception {
        // 获取文件ID
        String objectId = "5e42924980fb940ab75f141a";
        // 执行删除
        gridFSBucket.delete(new ObjectId(objectId));
        return "ok";
    }

5. 整合SpringBoot作为文件服务展示

当然也能和nginx放在一起使用

代码语言:javascript
复制
    /**
     * 借助nginx+springboot来访问gridfs中的文件内容
     * @param fileName
     * @return
     * @throws Exception
     */
    @GetMapping("/detail/{fileName}")
    public void detail(@PathVariable("fileName") String fileName, HttpServletResponse response) throws Exception {

        response.setContentType("text/html;charset=utf-8");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            gridFSBucket.downloadToStream(fileName, outputStream);

// 方式2
//            GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(fileName);
//            GridFsResource gridFsResource = new GridFsResource(gridFSDownloadStream.getGridFSFile(), gridFSDownloadStream);

//            String data = IOUtils.toString(gridFsResource.getInputStream(), "UTF-8");
//            System.out.println(data);

//            out.write(data.getBytes("UTF-8"));
//            out.write("风间影月".getBytes("UTF-8"));
        } finally {
            outputStream.close();
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BeJavaGod 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 配置config
  • 2. 基于gridfs的上传,读取与下载
  • 5. 整合SpringBoot作为文件服务展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档