繁体   English   中英

如何使用npm的请求承诺在POST中添加文件?

[英]How to add files in a POST using request-promise of npm?

我正在尝试使用npm的“request-promise”发送Curl请求。 我要发送的卷曲如下:

`curl \
-H "Content-Type: multipart/form-data" \
-F "original=@./${parent_path}"  \
-F "modified=@./${version_path}" \
-o "${out_path}" \
 ${URI}`

我在节点中的代码是:

BIMFile.findOne({ _id: responseDB.parent_id })
  .then(parent => {
      parent_path = parsePath(parent.path);
      version_path = parsePath(responseDB.path);
      console.log("PARENT!", parent_path, version_path);
      const URI =
        `${protocol}://${host_img_diff}:${port_img_diff}/diff`
      out_path = version_path + '.tmp.jpg';

      request.post({
        url: URI,
        formData: {
          file: fs.createReadStream(parent_path),
          file: fs.createReadStream(version_path)
        }
      }).then((apiResponse) => {
        console.log('apiUPDATEResponse', apiResponse);
      })

结果是:

Unhandled rejection StatusCodeError: 400 - "<!DOCTYPE HTML PUBLIC 
\"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>400 Bad 
Request</title>\n<h1>Bad Request</h1>\n<p>The browser (or proxy) sent a re
quest that this server could not understand.</p>\n"
at new StatusCodeError (/backend/node_modules/request-promise- 
core/lib/errors.js:32:15)
at Request.plumbing.callback (/backend/node_modules/request-promise- 
core/lib/plumbing.js:104:33)
at Request.RP$callback [as _callback] (/backend/node_modules/request- 
promise-core/lib/plumbing.js:46:31)
at Request.self.callback (/backend/node_modules/request/request.js:185:22)
at emitTwo (events.js:126:13)
at Request.emit (events.js:214:7)
at Request.<anonymous> (/backend/node_modules/request/request.js:1161:10)
at emitOne (events.js:116:13)
at Request.emit (events.js:211:7)
at IncomingMessage.<anonymous> 
(/backend/node_modules/request/request.js:1083:12)
at Object.onceWrapper (events.js:313:30)
at emitNone (events.js:111:20)
at IncomingMessage.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1055:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
at process._tickCallback (internal/process/next_tick.js:180:9)

服务器返回以下消息:

xxx.xx.x.xx - - [05/Apr/2019 10:00:15] "POST /diff HTTP/1.1" 400 -

如您所见,服务器无法理解发布请求。 有谁知道如何正确添加文件?

使用formData发送文件就像你正在做的那样,但是你遇到的一个问题是你在同一个属性中设置了两个文件,并且只设置了最后一个文件。

 console.log({ file: 1, file: 2 }); 

因此,如果file可以接收多个文件,则需要使用数组

const formData = {
   file: [
       fs.createReadStream(parent_path),
       fs.createReadStream(version_path)
   ]
}

如果您需要其他元数据, request模块也提供了一种方法

使用带有样式的'options'对象传递可选的元数据: {value: DATA, options: OPTIONS}用例:对于某些类型的流,您需要手动提供“文件”相关信息。
有关选项的更多信息,请参阅form-data README: https//github.com/form-data/form-data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM