Spring REST - 正在下载损坏/空白文件 [英] Spring REST - Damaged/Blank File being downloaded

查看:176
本文介绍了Spring REST - 正在下载损坏/空白文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个端点来呈现/提供PDF文件。
我已经通过以下链接构建API,但仍面临一些问题。

I am trying to create a endpoint to render/serve PDF file. I have gone through the following links to build the API, but still facing some issues.

link 1

链接2

以下是我的代码:

byte[] targetArray = null;

InputStream is = null;

InputStream objectData = object.getObjectContent();

BufferedReader reader = new BufferedReader(new InputStreamReader(objectData));

char[] charArray = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = reader.read(charArray, 0, charArray.length)) != -1) {

    builder.append(charArray, 0, numCharsRead);
}
reader.close();

objectData.close();
object.close();
targetArray = builder.toString().getBytes();

is = new ByteArrayInputStream(targetArray);


return ResponseEntity.ok().contentLength(targetArray.length).contentType(MediaType.APPLICATION_PDF)
                .cacheControl(CacheControl.noCache()).header("Content-Disposition", "attachment; filename=" + "testing.pdf")
                .body(new InputStreamResource(is));

当我使用邮递员点击我的API时,我可以下载PDF文件,但问题是它是完全空白。可能是什么问题?

When I hit my API using postman, I am able to download PDF file but the problem is it is totally blank. What might be the issue ?

推荐答案

多种方式从服务器下载文件,你可以使用 ResponseEntity< InputStreamResource> HttpServletResponse 。下面是两种下载方法。

There are multiple ways to download files from server, you can use ResponseEntity<InputStreamResource>, HttpServletResponse.Below are the two methods to download.

@GetMapping("/download1")
       public ResponseEntity<InputStreamResource> downloadFile1() throws IOException {

          File file = new File(FILE_PATH);
          InputStreamResource resource = new InputStreamResource(new FileInputStream(file));

          return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION,
                      "attachment;filename=" + file.getName())
                .contentType(MediaType.APPLICATION_PDF).contentLength(file.length())
                .body(resource);
       }

您可以使用 StreamingResponseBody 下载大型文件。在这种情况下,服务器同时将数据写入 OutputStream 浏览器读取数据,这意味着它的并行。

You can use StreamingResponseBody to download large files. In this case server writes data to OutputStream at same time Browser read data which means its parallel.

@RequestMapping(value = "downloadFile", method = RequestMethod.GET)
    public StreamingResponseBody getSteamingFile(HttpServletResponse response) throws IOException {
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=\"demo.pdf\"");
        InputStream inputStream = new FileInputStream(new File("C:\\demo-file.pdf"));
        return outputStream -> {
            int nRead;
            byte[] data = new byte[1024];
            while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
                System.out.println("Writing some bytes..");
                outputStream.write(data, 0, nRead);
            }
        };
    }

这篇关于Spring REST - 正在下载损坏/空白文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆