先看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());
}
}
}