【问题标题】:Angular2 download PDF from REST APIAngular2 从 REST API 下载 PDF
【发布时间】:2017-10-12 19:04:11
【问题描述】:

我有一个必须返回 PDF 的 REST API。我已将 PDF 转换为字节数组,并将其与我的 REST 端点一起返回。

有效载荷如下所示:

{"_body":"%PDF-1.4\n%����\n1 0 obj\n<<\n/Type /Catalog\n/Version /1.4\n/Pages 2 0 R\n>>\nendobj\n2 0 obj\n<<\n/Type /Pages\n/Kids [3 0 R]\n/Count 1\n>>\nendobj\n3 0 obj\n<<\n/Type /Page\n/MediaBox [0.0 0.0 612.0 792.0]\n/Parent 2 0 R\n/Contents 4 0 R\n/Resources 5 0 R\n>>\nendobj\n4 0 obj\n<<\n/Filter /FlateDecode\n/Length 51\n>>\nstream\r\nx�s\n��w3T04R\bI�245P0\u0007�\u0014.\r�Ԝ�|�\u0000\u00177��\nM��,.�\u0010.\u0000�\u001f\n�\r\nendstream\nendobj\n5 0 obj\n<<\n/Font 6 0 R\n>>\nendobj\n6 0 obj\n<<\n/F1 7 0 R\n>>\nendobj\n7 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n/BaseFont /Courier-Bold\n/Encoding /WinAnsiEncoding\n>>\nendobj\nxref\n0 8\n0000000000 65535 f\r\n0000000015 00000 n\r\n0000000078 00000 n\r\n0000000135 00000 n\r\n0000000247 00000 n\r\n0000000371 00000 n\r\n0000000404 00000 n\r\n0000000435 00000 n\r\ntrailer\n<<\n/Root 1 0 R\n/ID [<A0C5C7406F668B945EA55D6F36833E8A> <A0C5C7406F668B945EA55D6F36833E8A>]\n/Size 8\n>>\nstartxref\n535\n%%EOF\n","status":200,"ok":true,"statusText":"OK","headers":{"Content-Type":["application/json;charset=UTF-8"]},"type":2,"url":"http://localhost:8090/api/forms/1/submissions/1/pdf"}

我已经在我的 Angular2 应用程序中导入了 FileSaver,但我找不到让它工作的方法。我需要在收到 PDF 时在客户端将其显示为下载的文件。我怎样才能做到这一点?我应该改变我的 REST 端点返回数据的方式吗?

【问题讨论】:

    标签: spring rest angular filesaver.js


    【解决方案1】:

    您需要将数据流式传输回客户端,以便能够下载而不是作为字节数组发送。由于Spring是基于servlet的,所以可以这样操作

    .
    .
    .
    protected void doGet(HttpServletRequest req, HttpServletResponse res) {
        Path downloadFile = Paths.get("path/to/your/file");
        res.setContentType("application/octet-stream");
        res.setHeader("Content-Disposition", "attachment;filename="+ downloadFile.getFileName().toString());
        OutputStream os = res.getOutputStream();
        InputStream is = Files.newInputStream(downloadFile);
        byte[] buffer = new byte[1024];
        int read = -1;
        while (((read = is.read(buffer)) != -1) {
            os.write(buffer);
        }
        is.close();
        os.close();
    }
    

    您可能想要进行错误处理,我只是为了简洁而省略了

    【讨论】:

    • 我在我的端点中尝试过。我还想出了如何使用 Angular2 保存文件。但是我下载的 PDF 不正确,它是用 UTF-8 编码的,而原始 PDF 是用 ANSI 编码的。你认为编码是问题吗?我还尝试在我的 Spring 端点中将字符集指定为 ANSI,但它不支持它。
    • @Servietsky 首先,如果您可以阅读文件而不会看到有趣的字符,则不必担心。其次,UTF-8 是比 ANSI 更广泛的字符集,因此无论文档中有什么字节,它们都应该被正确解码。所以总而言之,别担心
    • 如果我比较两个文件(ANSI 和 UTF-8),它们的字符不同。这 ”?”您可以在有效负载中看到 ANSI 文件中的实际字符。
    • 我的意思是当你双击文件阅读时,你看到有趣的字符了吗?你不用太在意文档的字节内容,只要没看到解码问题就可以了
    • 当我从 REST API 打开 PDF 时,它包含一个没有任何内容的空页面。原始文件里面有一些文字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2014-12-24
    • 2021-08-20
    • 2021-01-09
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多