用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能

这篇文章主要讲解了“用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能”吧!

创新互联主营朝阳网站建设的网络公司,主营网站建设方案,app软件定制开发,朝阳h5微信小程序开发搭建,朝阳网站营销推广欢迎朝阳等地区企业咨询

       应项目要求,使用MongoDB的GridFS来存储文件数据。

需求点:1、要求可实现多文件上传;2、可以动态新增、删除文件列表中的文件;3、使用文件ID下载;4、支持跨域;

提示:SpringMVC在4.2版本中有快捷的跨域处理方式@CrossOrigin

第一步:使用LayUI的upload控件编写JSP页面。


			附件说明
			
  				选择多文件
  				开始上传
  				
   				
      				
        				文件名大小状态操作
      				
      				
    			
  				
  
 

第二步:编写JS代码

第三步:使用SpringMVC+MongDB+GridFS处理文件上传、下载、删除操作

1)applicationContext-dao.xml文件配置。(此文件还可以使用Properties文件进行配置,亦可以再丰富mongo的相关属性)



	
	
	
    
    
    

2)application-service.xml的配置。



	

3)springmv.xml文件的配置。




	

	

	
		
		
	

	
	
		
		
		
		
	

4)编写业务层接口,主要包括以下几个方法。

public interface IFileService {

	ResponseResult storeUploadFile(MultipartFile file, String applyCode);
	
	ResponseEntity attachmentDownload(String fileId);
	
	ResponseResult attachmentList(String applyCode);
	
	ResponseResult attachmentDelete(String fileId);
}

5)编写业务层实现类。

@Service
public class FileService implements IFileService {

	@Autowired
	GridFsTemplate gridFsTemplate;
	
	@Value("${FILE_SERVER_BASEURL}")
	private String FILE_SERVER_BASEURL;

	@Override
	public ResponseResult storeUploadFile(MultipartFile file, String applyCode) {
		DBObject metadata = new BasicDBObject();
		metadata.put("applyCode", applyCode);
		metadata.put("originalFilename", file.getOriginalFilename());//保存原始的文件名
		metadata.put("contentType", file.getContentType());
		String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
		String fileName = IDUtils.genItemId() + suffix;//处理存储的文件名字
		GridFSFile gridFSFile = null;
		try {
			gridFSFile = gridFsTemplate.store(file.getInputStream(), fileName, metadata);
		} catch (IOException e) {
			e.printStackTrace();
			return ResponseResult.FAIL();
		}
		String fileId = gridFSFile.getId().toString();
		String resultUrl = FILE_SERVER_BASEURL+"/attachment/download/" + fileId;
		Map data = new HashMap<>();
		data.put("src", resultUrl);
		data.put("fileId", fileId);
		return ResponseResult.OK(data);
	}

	@Override
	public ResponseEntity attachmentDownload(String fileId) {
		Query query = new Query(Criteria.where("_id").is(fileId));
		GridFSDBFile gridFsDbFile = gridFsTemplate.findOne(query);
		String fileName = gridFsDbFile.getMetaData().get("originalFilename").toString();
		try {
			fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");//文件名转码
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		HttpHeaders header = new HttpHeaders();
		header.setContentType(MediaType.valueOf(gridFsDbFile.getMetaData().get("contentType").toString()));
		header.setContentDispositionFormData("attachment", fileName);
		InputStreamResource resource = new InputStreamResource(gridFsDbFile.getInputStream());
		return new ResponseEntity<>(resource,header,HttpStatus.CREATED);
	}

	@Override
	public ResponseResult attachmentList(String applyCode) {
		Query query = new Query(new Criteria().is("{'metadata':{'applyCode':'" + applyCode + "'}})"));//通过metadata中的applyCode获取当前申请单中所有的文件列表。
		List fsFileList = gridFsTemplate.find(query);
		List fileNameList = new ArrayList();
		for(GridFSDBFile file : fsFileList) {
			fileNameList.add(file.getMetaData().get("originalFilename").toString());
		}
		return ResponseResult.OK(fileNameList);
	}

	@Override
	public ResponseResult attachmentDelete(String fileId) {
		Query query = new Query(Criteria.where("_id").is(fileId));
		gridFsTemplate.delete(query);
		return ResponseResult.SUCCESS();
	}

}

注意:此实现类中使用了SpringMVC中ResponseEntity的方式进行文件的下载。

6)Controller层。

@RestController
public class AttachController {

	@Autowired
	IFileService fileService;
	
	@CrossOrigin("http://localhost:8081")
	@RequestMapping(value="/attachment/upload",method=RequestMethod.POST)
	@ResponseBody
	public ResponseResult attachmentUpload(@RequestParam(value = "file") MultipartFile file,String applyCode) {
		return fileService.storeUploadFile(file, applyCode);
	}
	
	@CrossOrigin("http://localhost:8081")
	@RequestMapping(value="/attachment/download/{fileId}",method=RequestMethod.GET)
	public ResponseEntity attachmentDownload(@PathVariable String fileId){
		return fileService.attachmentDownload(fileId);
	}
	
	@CrossOrigin("http://localhost:8081")
	@RequestMapping(value="/attachment/list",method=RequestMethod.POST)
	@ResponseBody
	public ResponseResult attachmentList(String applyCode) {
		return fileService.attachmentList(applyCode);
	}
	
	@CrossOrigin("http://localhost:8081")
	@RequestMapping("/attachment/delete")
	@ResponseBody
	public ResponseResult attachmentDelete(String fileId) {
		return fileService.attachmentDelete(fileId);
	}
}

注意:

1)LayUI的多文件上传其实为多文件逐个文件上传,也就是将文件数组中的文件循环调用文件上传方法。

2)此Service层中的文件上传的方法为单文件的方式,若为原始或其他前端实现可稍微改造即可。

感谢各位的阅读,以上就是“用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能”的内容了,经过本文的学习后,相信大家对用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


分享标题:用SpringMVC+MongoDB+Layui实现文件的上传、下载和删除功能
分享网址:http://azwzsj.com/article/gcoged.html

其他资讯