使用SpringMVC + mongodb 做文件的上传和下载,下载的文件除TXT(乱码)外均无法打开。1.怀疑是springmvc messageconverter配置的问题,尝试配置了byteArrayConverter
2.怀疑是上传存储到mongodb时文件损坏下载和上传的代码如下,求大佬帮忙检查一下问题出在哪
下载部分:使用ResponseEntity<byte[]>对象返回,尝试配置了springmvc 的 ByteArrayConverter
配置文件:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>image/jpeg</value>
<value>image/png</value>
<value>application/pdf</value>
<value>image/gif</value>
<value>application/octet-stream</value>
<value>text/plain</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> rest:
/**
* 下载文件请求
*
* @param fileId 文件ID
* @return 文件流
*/
@CrossOrigin
@RequestMapping(value = "/download/{fileId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> fileDownload(@PathVariable String fileId) throws Exception {
//从MongoDB获取文件
GridFSDBFile file = fileService.getFileById(fileId);
String fileType = file.getContentType();
//设置文件ContentType
MediaType mediaType = FileUtil.getEnableStr(fileType);
//获取文件字节流
byte[] outByte = FileUtil.gridFSBFileToByte(file);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
headers.setContentDispositionFormData("attachment",file.getFilename()+"."+fileType);
//返回前端
return new ResponseEntity<>(outByte, headers, HttpStatus.OK);
}service:
@Override
public GridFSDBFile getFileById(String fileId) throws RestServiceException {
GridFSDBFile file =
gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
if (file == null) {
throw new RestServiceException("找不到相关文件!请检查fileId");
}
return file;
}上传部分: rest:
/**
* 接受前端上传的文件并存储至MongoDB
*
* @param file 前端上传的文件
* @return 处理结果信息
*/
@CrossOrigin
@ResponseBody
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ReturnInfo fileUpload(@RequestParam MultipartFile file) throws Exception {
ReturnInfo<Map> info = new ReturnInfo<>();
if (!file.isEmpty()) {
BufferedInputStream inputStream = new BufferedInputStream(file.getInputStream());
String fileId = fileService.fileUpload(inputStream);
info.setCode(ReturnInfo.OK);
info.setMessage("上传成功!");
Map<String, String> resultMap = new HashMap<>();
resultMap.put("fileId", fileId);
info.setData(resultMap);
return info;
} else {
info.setMessage("文件不能为空");
info.setCode(ReturnInfo.ERROR);
return info;
} }
service:
/**
* 文件上传
*
* @param fileInput 文件输入流
* @return mongodb对应文件id
*/
@Override
public String fileUpload(InputStream fileInput) throws RestServiceException {
String fileType = FileUtil.getFileType(fileInput);
System.out.println(fileType);
//文件类型判断
if (!FileUtil.ENABLE_TYPES.contains(fileType)) {
throw new RestServiceException("不支持的文件类型!");
}
GridFSFile uploadFile = gridFsTemplate.store(fileInput, StringUtil.getUUID(), fileType);
return uploadFile.getId().toString();
}
2.怀疑是上传存储到mongodb时文件损坏下载和上传的代码如下,求大佬帮忙检查一下问题出在哪
下载部分:使用ResponseEntity<byte[]>对象返回,尝试配置了springmvc 的 ByteArrayConverter
配置文件:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>image/jpeg</value>
<value>image/png</value>
<value>application/pdf</value>
<value>image/gif</value>
<value>application/octet-stream</value>
<value>text/plain</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven> rest:
/**
* 下载文件请求
*
* @param fileId 文件ID
* @return 文件流
*/
@CrossOrigin
@RequestMapping(value = "/download/{fileId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<byte[]> fileDownload(@PathVariable String fileId) throws Exception {
//从MongoDB获取文件
GridFSDBFile file = fileService.getFileById(fileId);
String fileType = file.getContentType();
//设置文件ContentType
MediaType mediaType = FileUtil.getEnableStr(fileType);
//获取文件字节流
byte[] outByte = FileUtil.gridFSBFileToByte(file);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
headers.setContentDispositionFormData("attachment",file.getFilename()+"."+fileType);
//返回前端
return new ResponseEntity<>(outByte, headers, HttpStatus.OK);
}service:
@Override
public GridFSDBFile getFileById(String fileId) throws RestServiceException {
GridFSDBFile file =
gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
if (file == null) {
throw new RestServiceException("找不到相关文件!请检查fileId");
}
return file;
}上传部分: rest:
/**
* 接受前端上传的文件并存储至MongoDB
*
* @param file 前端上传的文件
* @return 处理结果信息
*/
@CrossOrigin
@ResponseBody
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ReturnInfo fileUpload(@RequestParam MultipartFile file) throws Exception {
ReturnInfo<Map> info = new ReturnInfo<>();
if (!file.isEmpty()) {
BufferedInputStream inputStream = new BufferedInputStream(file.getInputStream());
String fileId = fileService.fileUpload(inputStream);
info.setCode(ReturnInfo.OK);
info.setMessage("上传成功!");
Map<String, String> resultMap = new HashMap<>();
resultMap.put("fileId", fileId);
info.setData(resultMap);
return info;
} else {
info.setMessage("文件不能为空");
info.setCode(ReturnInfo.ERROR);
return info;
} }
service:
/**
* 文件上传
*
* @param fileInput 文件输入流
* @return mongodb对应文件id
*/
@Override
public String fileUpload(InputStream fileInput) throws RestServiceException {
String fileType = FileUtil.getFileType(fileInput);
System.out.println(fileType);
//文件类型判断
if (!FileUtil.ENABLE_TYPES.contains(fileType)) {
throw new RestServiceException("不支持的文件类型!");
}
GridFSFile uploadFile = gridFsTemplate.store(fileInput, StringUtil.getUUID(), fileType);
return uploadFile.getId().toString();
}
解决方案 »
- 求代码样板
- jfreechart多项目问题
- 跪求tomcat关闭时出下如下错误??
- jsp页面提交到sqlserver2000数据库中数据中文乱码问题
- 我的window.location.href="aa.jsp?pageno=2"为何不起作用
- 本人初学,现正利用<J2EE 全实例教程>在学习,但遇到点问题,请各位高手指点一下!!!
- 帮忙看一下下面的jsp代码,是否有误
- 有没有可以编辑<textarea>内容的组件啊,就是能够编辑里面的文字的组件?
- javascript中confirm()方法弹出的对话框的默认焦点是在yes上的。如何改在no上。
- 设置好环境,可是,不会用啊?
- struts2和hibernate整合,hibernate反转TAddress表的外键userid为实体类,页面要根据userid进行修改地址,怎么改
- springboot 2集成mybatis遇到错误
* 下载文件请求
*
* @param fileId 文件ID
* @return
*/
@CrossOrigin
@RequestMapping(value = "/download2/{fileId}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<InputStreamResource> fileDownload2(@PathVariable String fileId) throws Exception {
//从MongoDB获取文件
GridFSDBFile file = fileService.getFileById(fileId);
String fileType = file.getContentType();
//设置文件ContentType
MediaType mediaType = FileUtil.getEnableStr(fileType);
InputStreamResource resource = new InputStreamResource(file.getInputStream());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(mediaType);
headers.setContentDispositionFormData("attachment",file.getFilename()+"."+fileType);
//返回前端
return new ResponseEntity<>(resource, headers, HttpStatus.OK);
}