spring boot 2.1.2 实现mongodb GridFSFile文件预览

先看POM


        org.springframework.boot
        spring-boot-starter-data-mongodb
        2.1.2.RELEASE


        org.apache.commons
        commons-io
        1.3.2


        org.mongodb
        mongodb-driver-core
        3.8.2

该版本里不支持GridFSDBFile,所以输出流的时候不能直接使用writeTo。亲测以下方法可用

service代码:

import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.ty.ext.admin.core.common.constant.Const;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.MongoDbFactory;
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.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

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

@Service
public class GridfsService {

    @Autowired
    private GridFsTemplate gridFsTemplate;

    @Autowired
    private MongoDbFactory mongoDbFactory;


    /**
     * 据id返回文件
     */
    public GridFSFile getById(String fileId){
        Query query = Query.query(Criteria.where("_id").is(fileId));
        GridFSFile gfsFile = gridFsTemplate.findOne(query);
        return gfsFile;
    }

    /**
     * 预览图片
     * @param fileId
     * @param response
     * @param request
     * @throws IOException
     */
    public void show(String fileId,String type, HttpServletResponse response, HttpServletRequest request)throws IOException {
        GridFSFile gridFSFile = this.getById(fileId);
        if (gridFSFile != null) {
            // mongo-java-driver3.x以上的版本就变成了这种方式获取
            GridFSBucket bucket = GridFSBuckets.create(mongoDbFactory.getDb());
            GridFSDownloadStream gridFSDownloadStream = bucket.openDownloadStream(gridFSFile.getObjectId());
            GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
            String fileName = gridFSFile.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", "inline;filename=\"" + fileName + "\"");
            
            IOUtils.copy(gridFsResource.getInputStream(), response.getOutputStream());
        }
    }
}

你可能感兴趣的:(spring boot 2.1.2 实现mongodb GridFSFile文件预览)