javascript - Spring 控制器返回文件(适用于 csv,不适用于图像类型或 zip)
问题描述
我有与返回文件(存储为字节数组)一起使用的控制器。
@ResponseBody
@GetMapping(value = "/get")
public void getFile(HttpServletResponse response, @RequestParam(value = "id") String id) throws Exception {
byte[] file = findFileById(id);
response.reset();
response.setBufferSize(BUFFER_SIZE);
try {
response.getOutputStream().write(file);
} catch (IOException e) {
e.printStackTrace();
}
}
我在 javascript 中发出 ajax 获取请求,并使用 Blob() 创建文件新文件。它适用于 .csv 文件,但当我尝试使其适用于 png、jpeg 和 zip 文件时失败。
编辑:我可以在 js 中制作文件,但图像和 zip 文件已损坏。经过一番检查,我发现图像文件比原始文件大。
解决方案
我遇到了这个问题并用下面的策略解决了。你可以试试这个。在写入 outputStream 之前,please set the Content-Type header to image/png (it's for png images)
从给定文件中计算 bufferSize 的大小。
response.setContentType("image/png");
byte[] bytesArray = Utils.convertFileToByte(file);
response.setBufferSize(bytesArray.length);
response.getOutputStream().write(bytesArray);
对于 JPEG 文件:
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
byte[] bytesArray = Utils.convertFileToByte(file);
response.setBufferSize(bytesArray.length);
response.getOutputStream().write(bytesArray);
推荐阅读
- angular - 如何在 Angular 2+ 的 ngbDatePicker 中突出显示今天的日期?
- symfony - FOSuserBundle 覆盖控制器
- css - 使用线将单个 div 与周围的多个 div 连接起来
- c# - 根据属性列表指定 AutoMapper 映射
- c++ - 如果你有一个固定大小的数组,并且需要遍历它!n 次,那么使用二分查找如何改变时间复杂度?
- omnet++ - 为传感器选择随机初始位置,但在特定区域
- opencv - 确定数据类型并用作模板类型名
- ios - 如何在 UIScrollView 中处理 UIScrollView
- sql - 在 Oracle 中查询 XML
- ios - FileManager MoveItem 回调 - Swift