【问题标题】:How to send a POST request a file with Content-Type: application/octet-stream in Node js如何在 Node js 中使用 Content-Type: application/octet-stream 发送 POST 请求文件
【发布时间】:2019-06-26 16:06:02
【问题描述】:

我正在尝试将某些内容上传到 Facebook 的服务器。他们的官方文档指出:

使用对话框中的令牌,您可以向我们的 Graph API 提交以下调用以提交您的 .zip。请注意,我们使用的是 video 子域,但这是故意的,因为该 URL 被配置为接收更大的上传。

curl -X POST https://graph-video.facebook.com/{App ID}/assets 
  -F 'access_token={ASSET UPLOAD ACCESS TOKEN}' 
  -F 'type=BUNDLE' 
  -F 'asset=@./{YOUR GAME}.zip' 
  -F 'comment=Graph API upload'

我正在尝试使用 request 模块将此 curl 请求转换为 node.js。

            const myzip = zipDir+file.appName+".zip"
            console.log(myzip)
            var url = "https://graph-video.facebook.com/"+file.appId+"/assets";
            const options = {
                url: url,
                headers: {
                  "Content-Type": "application/octet-stream"
                }
              }
            var req = request.post(options, function (err, resp, body) {
                console.log('REQUEST RESULTS:', err, resp.statusCode, body);
                if (err) {
                   console.log('Error!');
                  reject();
                } else {
                   console.log('URL: ' + body);
                  resolve();
                }
              });
              var form = req.form();
              var zipReadStream = fs.createReadStream(myzip,{encoding: "binary"})
              zipReadStream.setEncoding('binary')
              form.append('asset', zipReadStream);
              form.append("access_token", file.token);
              form.append("type", "BUNDLE");
              form.append("comment", mycomment)

虽然我已将标题设置为 "Content-Type": "application/octet-stream" ,但我仍然收到来自 facebook 的错误

OAuth "Facebook Platform" "invalid_request" "(#100) Invalid file. Expected file of one of the following types: application/octet-stream"

此外,当我尝试记录我的请求时,我得到的内容是 'Content-Type': 'multipart/form-data 而不是 application/octet-stream 事件,尽管我已经明确指定了这一点。

【问题讨论】:

    标签: node.js request mime-types content-type


    【解决方案1】:

    如果您将数据作为表单的一部分上传,则必须使用 multipart/form-data 作为您的 Content-Type

    可以为每个文件设置表单上特定文件的Content-Type,但 Facebook 似乎不希望为此提供额外的数据。

    不要为您的 HTTP 请求设置Content-Type,您应该没问题,因为请求模块会为您设置它。此外,您可以在此处找到文档:https://github.com/request/request#multipartform-data-multipart-form-uploads

    【讨论】:

    • 我删除了手动标题。但我得到同样的错误。如何将文件发布为octet-stream?我对内容类型了解不多。我试图将流读取为二进制 fs.createReadStream(myzip,{encoding: "binary"}) 但这似乎没有帮助
    • 正如我链接到的文档中提到的,使用asset: { value: /* your stream */, options: { filename: 'somefile.zip', contentType: 'application/octet-stream'}}。这会出现在您的表单数据中。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2012-06-25
    • 2012-09-11
    • 2013-12-28
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多