环境的搭建 pom文件添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.配置文件中添加配置项
spring.data.mongodb.uri=mongodb://ip:27017/test
spring.data.mongodb.gridFsDatabase=test
mongo.dataBaseName=test
3.添加文件最大上传的限制
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize("50MB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("500MB");
return factory.createMultipartConfig();
}
4.添加gridFS bucket
@Bean
public GridFsTemplate gridFsTemplate(MongoDbFactory dbFactory, MongoConverter converter) {
return new GridFsTemplate(dbFactory, converter, "orm");
}
5.文件上传contriller
@Controller
@RequestMapping("/file")
public class FileGridController {
@Autowired
private FileGridService fileGridService;
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
@ResponseBody
public List<GridFSFileVO> uploadFile(HttpServletRequest request) throws Exception {
request.setCharacterEncoding("utf-8");
return fileGridService.store(request.getParts());
}
/**
* 下载
*
* @param fileId 文件id
* @param response
* @return
*/
@RequestMapping(value = "/downloadFile")
public void downloadFile(@RequestParam(name = "file_id") String fileId, HttpServletRequest request, HttpServletResponse response) throws Exception {
//查询文件服务器的文件
GridFSDBFile gfsfile = fileGridService.findOne(fileId);
if (gfsfile == null) {
return;
}
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.setContentType(gfsfile.getContentType());
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
gfsfile.writeTo(response.getOutputStream());
}
/**
* 删除文件
*
* @param fileId
* @return
*/
@RequestMapping(value = "/deleteFile", method = RequestMethod.POST)
@ResponseBody
public Object deleteFile(@RequestParam(name = "file_id") String fileId) {
// 查询单个文件
try {
fileGridService.delete(fileId);
} catch (Exception e) {
return e.getMessage();
}
return "OK";
}
}
6.文件上传service
package com.mongo.file.service;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.Part;
import com.mongo.file.vo.GridFSFileVO;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSFile;
/**
* 文件上传service
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:48:24
* @since 0.0.1
*/
public interface FileGridService {
/**
* 根据文件id查询文件信息
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:48:35
* @since 0.0.1
* @param fileId
* @return
* GridFSDBFile
*/
GridFSDBFile findOne(String fileId);
/**
* 根据文件id删除文件
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:48:45
* @since 0.0.1
* @param fileId
* void
*/
void delete(String fileId);
/**
* 保存文件
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:48:54
* @since 0.0.1
* @param content 获得文件输入流
* @param filename 获得提交的文件名
* @param contentType 获得文件类型
* @return
* GridFSFile
*/
GridFSFile store(InputStream content, String filename, String contentType);
/**
* 批量上传文件
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:58:54
* @since 0.0.1
* @param parts
* @return
* List<GridFSFile>
*/
List<GridFSFileVO> store(Collection<Part> parts);
}
7.文件上传实现类
package com.mongo.file.service.impl;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.Part;
import org.springframework.beans.BeanUtils;
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.GridFsTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.mongo.file.service.FileGridService;
import com.mongo.file.vo.GridFSFileVO;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSFile;
/**
* 文件服务实现类
*
*<hr>
* @author hanjidong
* @date 2020年11月11日 上午10:49:12
* @since 0.0.1
*/
@Service
public class FileGridServiceImpl implements FileGridService {
/**
* 获得SpringBoot提供的mongodb的GridFS对象
*/
@Autowired
private GridFsTemplate gridFsTemplate;
/**
* 查询文件
*/
@Override
public GridFSDBFile findOne(String fileId) {
Query query = Query.query(Criteria.where("_id").is(fileId));
// 查询单个文件
return gridFsTemplate.findOne(query);
}
/**
* 删除文件
*/
@Override
public void delete(String fileId) {
Query query = Query.query(Criteria.where("_id").is(fileId));
// 查询单个文件
GridFSDBFile gfsfile = gridFsTemplate.findOne(query);
Assert.notNull(gfsfile, "没有查询到id="+fileId+"的文件");
gridFsTemplate.delete(query);
}
/**
* 保存文件
*/
@Override
public GridFSFile store(InputStream content, String filename, String contentType) {
return gridFsTemplate.store(content, filename, contentType);
}
/**
* 批量上传文件
*/
@Override
public List<GridFSFileVO> store(Collection<Part> parts) {
//上传单个文件
if(parts == null || parts.size() == 0 || (parts.size() ==1 && parts.iterator().next().getSize() == 0)){
throw new IllegalArgumentException("请选择上传的文件");
}
//Part parts = request.getPart("file");
//返回所有的上传文件的信息
List<GridFSFileVO> fsList = new ArrayList<>();
for (Part part : parts) {
long size = part.getSize();
try {
GridFSFile gridFSFile = store(part.getInputStream(), part.getSubmittedFileName(), part.getContentType());
System.out.println(gridFSFile);
GridFSFileVO vo= new GridFSFileVO();
BeanUtils.copyProperties(gridFSFile, vo);
System.out.println(vo);
GridFSDBFile file = new GridFSDBFile();
BeanUtils.copyProperties(gridFSFile, file);
fsList.add(vo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return fsList;
}
public static void main(String[] args) {
}
}