springboot 集成mongo GRIDFS 文件服务器实现 上传下载删除

3 篇文章 0 订阅
1 篇文章 0 订阅

环境的搭建 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) {
	
}
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring BootMongoTemplate可以用来操作GridFSGridFSMongoDB的一种文件存储机制,它将大文件拆分成小的chunks并存储在MongoDB的集合中。GridFS适用于存储和检索大文件,比如音频、视频或者其他大型文件。 在Spring Boot中使用MongoTemplate操作GridFS需要进行以下步骤: 1. 首先,在`pom.xml`文件中添加MongoDBSpring Data MongoDB的依赖。例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 2. 在Spring Boot的配置文件(`application.properties`或者`application.yml`)中配置MongoDB的连接信息,例如: ```properties spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.database=mydb ``` 3. 创建一个MongoTemplate bean,用于操作MongoDB。可以在Spring Boot的配置类中使用`@Bean`注解创建该bean,例如: ```java @Configuration public class MongoConfig { @Bean public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MongoMappingContext context) { return new MongoTemplate(mongoDbFactory, context); } } ``` 4. 使用MongoTemplate进行GridFS操作。例如,存储一个文件GridFS: ```java @Autowired private MongoTemplate mongoTemplate; public void saveFileToGridFS(InputStream fileInputStream, String filename) { ObjectId fileId = mongoTemplate.store(fileInputStream, filename); // 可以根据需要进行一些操作,比如保存fileId到其他集合等 } ``` 5. 检索GridFS中的文件: ```java @Autowired private MongoTemplate mongoTemplate; public GridFSFile getFileFromGridFS(String filename) { Query query = Query.query(Criteria.where("filename").is(filename)); return mongoTemplate.findOne(query, GridFSFile.class); } ``` 上述代码只是一个简单的示例,你可以根据实际需求进行更复杂的操作。希望对你有所帮助!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值