spring boot 使用mongodb上传文件,下载文件

spring boot 集成mongodb这里就不写了。
1、增加配置类,启动类里别忘了导入

package com.viewhigh.gov;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

public class MongodbConfig {
    @Value("${spring.data.mongodb.database}")
    String db;

    //GridFSBucket用于打开下载流
    @Bean
    public GridFSBucket getGridFSBucket(MongoClient mongoClient) {
        MongoDatabase database = mongoClient.getDatabase(db);
        GridFSBucket gridFSBucket = GridFSBuckets.create(database);
        return gridFSBucket;
    }
}

2、实现类:

package com.viewhigh.gov.mongodb.controller;

import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.viewhigh.gov.utils.result.R;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
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.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * @author : maybesuch
 * @version : 1.0
 * @Description : GridFS文件基本操作
 * @Date : 2020/1/8 10:16
 * @Copyright : Copyright (c) 2020 All Rights Reserved
 **/
@RestController
@RequestMapping("/gridfs")
public class GridFSController {
    @Autowired
    private GridFsTemplate gridFsTemplate;
    @Autowired
    GridFSBucket gridFSBucket;
    /**
     * 上传文件
     *
     * @param multipartFile 文件
     * @return 上传成功文件id
     */
    @PostMapping("/upload")
    public R uploadFile(@RequestParam(value = "file") MultipartFile multipartFile) {
        // 设置meta数据值
        Map<String, String> metaData = new HashMap<>();
        metaData.put("tags", "test");
        // ...
        try (
                InputStream inputStream = multipartFile.getInputStream();
        ) {
            // 获取文件的源名称
            String fileName = multipartFile.getOriginalFilename();
            Long size = multipartFile.getSize();
            // 进行文件存储
            ObjectId objectId = gridFsTemplate.store(inputStream, fileName, metaData);
            // 返回文件的id
            HashMap<String,String> result = new HashMap<String,String>();
            result.put("accessoryName",fileName);
            result.put("accessorySize",String.valueOf(size));
            result.put("mongodbId",String.valueOf(objectId));
            return R.ok().put("data",result);

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
//    /**
//     * 获取文件信息
//     * @param fileId 文件id
//     **/
//    @PostMapping("/get/{fileId}")
//    public void getFile(@PathVariable("fileId") String fileId) {
//
//        //根据id查询文件
//        GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
//
//        if (gridFSFile == null) {
//            throw new RuntimeException("No file with id: " + fileId);
//        }
//        //获取流对象
//        GridFsResource resource = gridFsTemplate.getResource(gridFSFile);
//
//        /*可根据实际需求进行数据的获取*/
//        try {
//            //获取流中的数据
//            String content = IOUtils.toString(resource.getInputStream(), "UTF-8");
//            //获取byte[]信息
//            byte[] bytes = IOUtils.toByteArray(resource.getInputStream());
//
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//下载文件
    @RequestMapping(value = "/downloadFile")
    public void downloadFile(@RequestParam(name = "mongodbId") String fileId, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Query query = Query.query(Criteria.where("_id").is(fileId));
        // 查询单个文件
        GridFSFile gfsFile = gridFsTemplate.findOne(query);
        GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gfsFile.getObjectId());
        //创建GridFsResource对象,获取流
        GridFsResource gridFsResource = new GridFsResource(gfsFile, gridFSDownloadStream);
        String fileName = gfsFile.getFilename().replace(",", "");
        //处理中文文件名乱码
        if (request.getHeader("User-Agent").toUpperCase().contains("MSIE") ||
                request.getHeader("User-Agent").toUpperCase().contains("TRIDENT")
                || request.getHeader("User-Agent").toUpperCase().contains("EDGE")) {
            fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
        } else {
            //非IE浏览器的处理:
            fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
        }
        //通知浏览器进行文件下载
        response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
        response.addHeader("content-type","application/octet-stream");
        IOUtils.copy(gridFsResource.getInputStream(),response.getOutputStream());
    }

    /**
     * 删除文件
     * @param fileId 文件id
     */
    @PostMapping("/delete")
    public void deleteFile(@RequestParam(value = "mongodbId") String fileId) {
        // 根据文件id删除fs.files和fs.chunks中的记录
        gridFsTemplate.delete(Query.query(Criteria.where("_id").is(fileId)));

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zzzz_zzzz_zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值