在springboot中,执行如下代码实现文件下载
java"> @GetMapping("/file/download/test")public void Download(HttpServletResponse response){try {String path = "XXXXXXXXXXXX";//文件路径File file = new File(path);// 读到流中InputStream inputStream = Files.newInputStream(Paths.get(path));// 文件的存放路径response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));response.setContentLengthLong(file.length());ServletOutputStream outputStream = response.getOutputStream();byte[] b = new byte[1024];int len;//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1while ((len = inputStream.read(b)) > 0) {outputStream.write(b, 0, len);}inputStream.close();} catch (IOException e) {e.printStackTrace();}
}
访问地址,执行下载时,会出错:
No converter for [class cn.hutool.core.io.resource.InputStreamResource] with preset Content-Type 'application/octet-stream'
对于具有预设内容类型“application/octet流”的[class cn.hutool.core.io.resource.InputStreamResource],没有转换器
当然,在出现错误时,我在想是不是application/octet-stream的问题,也使用过multipart/form-data,但也是一样的结果。
application/octet-stream和multipart/form-data的区别:
或者是这个错误:
org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。
但是即使会报错,文件还是能完整的下载下来。
找了很久的解决方法,但是没有发现什么正确的答案。
这里贴出来一些别人的解答,供参考思考,本人试过但没成功:
Spring Boot 异常:HttpMessageNotWritableException: No Converter for [class ...] With Preset Content-Type - spring 中文网
No converter for XXX with preset Content-Type ‘application/octet-stream;charset=UTF-8‘_unkonwncontenttypeexception-CSDN博客
下载/导出问题(统一返回):No converter for xxx with preset Content-Type ‘application/octet-stream;charset=UTF-8-CSDN博客
这里给出帖主的解决方法:
既然这里访问文件能正确的完成下载,我们就让不进行异常操作:
java"> @GetMapping("/file/download/test")public void Download(HttpServletResponse response){try {String path = "XXXXXXXXXXXX";//文件路径File file = new File(path);// 读到流中InputStream inputStream = Files.newInputStream(Paths.get(path));// 文件的存放路径response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));response.setContentLengthLong(file.length());ServletOutputStream outputStream = response.getOutputStream();byte[] b = new byte[1024];int len;//从输入流中读取一定数量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1while ((len = inputStream.read(b)) > 0) {outputStream.write(b, 0, len);}inputStream.close();} catch (IOException e) {System.out.println("文件正在被下载");}
}