【问题标题】:Post request that returns a download file发布返回下载文件的请求
【发布时间】:2019-01-30 07:02:27
【问题描述】:

我正在向我的服务器发送数据,该服务器根据请求创建一个 pdf 文件,该请求创建得很好,但我无法将文件发送回客户端。我正在使用 React 提交表单

handleSubmit(event) {
event.preventDefault();
var body = {
  id: this.state.id,
  text: this.state.text
}
fetch('http://localhost:5000/pdf', {
            method: 'POST',
            body: JSON.stringify(body),
            headers: {
                'Content-Type': 'application/json'
            },
        }).then(function(file) {
          window.open(file.url);
        });
}

它的开放http://localhost:5000/pdf,但由于我没有它的 GET 路径,所以没有任何下载。这是我的 POST 路线

router.post('/pdf', async function(req, res) {
  var makePdf = require('./file-create/pdf.js');
  makePdf(req, res);
});

文件被返回为pdfDoc.pipe(res);

我不能只使用 GET 路由,因为我无法获取通过这种方式发送的数据,我怎样才能让这个文件发送到客户端?

【问题讨论】:

标签: javascript node.js reactjs


【解决方案1】:

当您使用 window.open 时,您正在调用 GET 请求。这将在带有 URL 的新选项卡中打开该 URL。当您将其从 GET 更改为 POST 时,这将不起作用。

要解决此问题,您可以使用downloadjs (https://www.npmjs.com/package/downloadjs) 来下载从服务器返回的 blob。

我在下面包含了一些示例代码。这包括带有获取请求的 index.html 文件和用于返回简单 pdf 的 server.js。

index.html

var body = {
  id: 1,
  text: 'hello world',
};

fetch('/download', {
  method: 'POST',
  body: JSON.stringify(body),
  headers: {
    'Content-Type': 'application/json'
  },
}).then(function(resp) {
  return resp.blob();
}).then(function(blob) {
  return download(blob, "CUSTOM_NAME.pdf");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.8/download.min.js"></script>

server.js

var express = require('express');
var app = express();

app.post('/download', function(req, res){
    res.download('./make-file/whatever.pdf');
});

app.listen(3000);

【讨论】:

    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多