求助,下载的文件打不开,网上各种方法都试过了

Cathy313 2019-10-16 09:23:02
代码如下所示,下载的文件除了txt其他的pdf、图片、excel均打不开。之前没发现这个问题,后来导入挂载目录的文件后报错。服务器环境linux

@RequestMapping(value = "/download")
public void download(@RequestBody FileUpload fileUpload, HttpServletResponse response) {
String fileName = fileUpload.getRealFileName();
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名(这个信息头会告诉浏览器这个文件的名字和类型)
response.setContentType("application/octet-stream");// 二进制流,不知道下载文件的类型"application/octet-stream;charset=utf-8"
String fileFullName = fileUpload.getFilePath() + fileUpload.getRandomFileName();
File file = new File(fileFullName);
try {
logger.error(response.getContentType());
OutputStream outputStream = null;// 文件输出流
outputStream = response.getOutputStream();
FileDownLoad.fileReadInDownLoading(file, outputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
logger.error(e.getMessage());
}
}

public static void fileReadInDownLoading(File file, OutputStream outputStream) {
if (file == null || !file.exists()) {
logger.error((file != null ? file.getPath() : "") + "文件不存在");
throw new BaseException(CrmExceptionCode.文件不存在);
}
byte[] buffer = new byte[1024];
FileInputStream fis = null;// 文件输入流
BufferedInputStream bis = null;// 带缓冲区的输入流
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while (i != -1) {
outputStream.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
try {
if (bis != null) {
bis.close();
}

if (fis != null) {
fis.close();
}

if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
} catch (IOException e) {
logger.error(e.getMessage());
}
}

}

...全文
521 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cathy313 2019-10-16
  • 打赏
  • 举报
回复
引用 5 楼 dkwuxiang 的回复:
String fileName = fileUpload.getRealFileName(); String fileFullName = fileUpload.getFilePath() + fileUpload.getRandomFileName(); 我只是更换了这两个变量,换成固定值,无论是图片,excel都是可下载,可打开的
我这段代码在别的项目里没有问题。跟这次的区别可能是这次源文件存放的目录是挂载到linux服务器上的,不知道这个会不会有影响。
dkwuxiang 2019-10-16
  • 打赏
  • 举报
回复
String fileName = fileUpload.getRealFileName(); String fileFullName = fileUpload.getFilePath() + fileUpload.getRandomFileName(); 我只是更换了这两个变量,换成固定值,无论是图片,excel都是可下载,可打开的
Cathy313 2019-10-16
  • 打赏
  • 举报
回复
引用 3 楼 dkwuxiang 的回复:
[quote=引用 2 楼 Cathy313 的回复:] [quote=引用 1 楼 dkwuxiang 的回复:] 你是导出的文件打不开,还是导入的文件打不开了?
下载的文件原路径文件是能打开的,通过代码下载下来的文件打不开。[/quote] 下载下来的文件格式对应吗? [/quote]检查过,路径、文件名、文件后缀都是对的。
dkwuxiang 2019-10-16
  • 打赏
  • 举报
回复
引用 2 楼 Cathy313 的回复:
[quote=引用 1 楼 dkwuxiang 的回复:] 你是导出的文件打不开,还是导入的文件打不开了?
下载的文件原路径文件是能打开的,通过代码下载下来的文件打不开。[/quote] 下载下来的文件格式对应吗?
Cathy313 2019-10-16
  • 打赏
  • 举报
回复
引用 1 楼 dkwuxiang 的回复:
你是导出的文件打不开,还是导入的文件打不开了?
下载的文件原路径文件是能打开的,通过代码下载下来的文件打不开。
dkwuxiang 2019-10-16
  • 打赏
  • 举报
回复
你是导出的文件打不开,还是导入的文件打不开了?
Cathy313 2019-10-16
  • 打赏
  • 举报
回复
找到原因了,被自己气哭了!!!

export function downloadMarketFile(fileUpload) {
  return request({
    url: '/fileUpload/download',
    responseType: 'blob', // !!!!必须
    method: 'post',
    data: fileUpload
  })
}
一直以为后台代码或者环境的问题,把所有可能性都找了一遍,结果是前端设置的问题。我前端用的vue
Cathy313 2019-10-16
  • 打赏
  • 举报
回复
引用 7 楼 qybao 的回复:
[quote=引用 6 楼 Cathy313 的回复:] 我这段代码在别的项目里没有问题。跟这次的区别可能是这次源文件存放的目录是挂载到linux服务器上的,不知道这个会不会有影响。
这个跟服务器没关系吧,你的代码有判断文件路径是否存在if (file == null || !file.exists()) ,只要路径对,就能正常运行 怀疑可能跟编码有关,response.setCharacterEncoding("utf-8");下载是UTF-8编码,文件读写是否也要用同样的编码? [/quote] 我用utf-8打开也是乱码,只有txt文件才是正常的,感觉真的很奇怪
qybao 2019-10-16
  • 打赏
  • 举报
回复
引用 6 楼 Cathy313 的回复:
我这段代码在别的项目里没有问题。跟这次的区别可能是这次源文件存放的目录是挂载到linux服务器上的,不知道这个会不会有影响。

这个跟服务器没关系吧,你的代码有判断文件路径是否存在if (file == null || !file.exists()) ,只要路径对,就能正常运行
怀疑可能跟编码有关,response.setCharacterEncoding("utf-8");下载是UTF-8编码,文件读写是否也要用同样的编码?

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧