首页 > 解决方案 > 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 文件已损坏。经过一番检查,我发现图像文件比原始文件大。

标签: javascriptjavaspring

解决方案


我遇到了这个问题并用下面的策略解决了。你可以试试这个。在写入 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);

推荐阅读