求助: springmvc 上传至 mongodb 后下载文件无法打开

[复制链接]
查看11 | 回复1 | 2021-1-27 06:48:01 | 显示全部楼层 |阅读模式
使用SpringMVC+mongodb做文件的上传和下载,下载的文件除TXT(乱码)外均无法打开。




1.怀疑是springmvcmessageconverter配置的问题,尝试配置了byteArrayConverter
2.怀疑是上传存储到mongodb时文件损坏
下载和上传的代码如下,求大佬帮忙检查一下问题出在哪

下载部分:使用ResponseEntity对象返回,尝试配置了springmvc的ByteArrayConverter
配置文件:



image/jpeg
image/png
application/pdf
image/gif
application/octet-stream
text/plain



rest:
/**
*下载文件请求
*
*@paramfileId文件ID
*@return文件流
*/
@CrossOrigin
@RequestMapping(value="/download/{fileId}",method=RequestMethod.GET)
@ResponseBody
publicResponseEntityfileDownload(@PathVariableStringfileId)throwsException{
//从MongoDB获取文件
GridFSDBFilefile=fileService.getFileById(fileId);
StringfileType=file.getContentType();
//设置文件ContentType
MediaTypemediaType=FileUtil.getEnableStr(fileType);
//获取文件字节流
byte[]outByte=FileUtil.gridFSBFileToByte(file);
HttpHeadersheaders=newHttpHeaders();
headers.setContentType(mediaType);
headers.setContentDispositionFormData("attachment",file.getFilename()+"."+fileType);
//返回前端
returnnewResponseEntity(outByte,headers,HttpStatus.OK);
}
service:
@Override
publicGridFSDBFilegetFileById(StringfileId)throwsRestServiceException{
GridFSDBFilefile=
gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(fileId)));
if(file==null){
thrownewRestServiceException("找不到相关文件!请检查fileId");
}
returnfile;
}

上传部分:
rest:
/**
*接受前端上传的文件并存储至MongoDB
*
*@paramfile前端上传的文件
*@return处理结果信息
*/
@CrossOrigin
@ResponseBody
@RequestMapping(value="/upload",method=RequestMethod.POST)
publicReturnInfofileUpload(@RequestParamMultipartFilefile)throwsException{
ReturnInfoinfo=newReturnInfo();
if(!file.isEmpty()){
BufferedInputStreaminputStream=newBufferedInputStream(file.getInputStream());
StringfileId=fileService.fileUpload(inputStream);
info.setCode(ReturnInfo.OK);
info.setMessage("上传成功!");
MapresultMap=newHashMap();
resultMap.put("fileId",fileId);
info.setData(resultMap);
returninfo;
}else{
info.setMessage("文件不能为空");
info.setCode(ReturnInfo.ERROR);
returninfo;
}
}
service:
/**
*文件上传
*
*@paramfileInput文件输入流
*@returnmongodb对应文件id
*/
@Override
publicStringfileUpload(InputStreamfileInput)throwsRestServiceException{
StringfileType=FileUtil.getFileType(fileInput);
System.out.println(fileType);
//文件类型判断
if(!FileUtil.ENABLE_TYPES.contains(fileType)){
thrownewRestServiceException("不支持的文件类型!");
}
GridFSFileuploadFile=gridFsTemplate.store(fileInput,StringUtil.getUUID(),fileType);
returnuploadFile.getId().toString();
}

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:48:01 | 显示全部楼层
还尝试过使用ResponseEntity[I]返回文件,结果还是一样:
/**
*下载文件请求
*
*@paramfileId文件ID
*@return
*/
@CrossOrigin
@RequestMapping(value="/download2/{fileId}",method=RequestMethod.GET)
@ResponseBody
publicResponseEntity[I]fileDownload2(@PathVariableStringfileId)throwsException{
//从MongoDB获取文件
GridFSDBFilefile=fileService.getFileById(fileId);
StringfileType=file.getContentType();
//设置文件ContentType
MediaTypemediaType=FileUtil.getEnableStr(fileType);
InputStreamResourceresource=newInputStreamResource(file.getInputStream());
HttpHeadersheaders=newHttpHeaders();
headers.setContentType(mediaType);
headers.setContentDispositionFormData("attachment",file.getFilename()+"."+fileType);
//返回前端
returnnewResponseEntity(resource,headers,HttpStatus.OK);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行