无法在节点应用程序中使用axios在POST请求上正确添加文件头

时间:2018-09-05 23:21:02

标签: node.js http curl post axios

我正在尝试使用axios将以下curl语法转换为node.js:

curl -X POST "https://my-target-baseURL.com/elements/api/files? 
path=%2Fmy-file&folderId=1234" 
-H "accept: application/json" 
-H "Authorization: SomeHeader 1234, OtherHeader 1234" 
-H "content-type: multipart/form-data" 
-F "file=@my-file.png;type=image/png"

为了将其转换,我正在做以下事情。

    const fileInfo = path.parse(req.file.filename)
    const fileFullName = fileInfo.name + fileInfo.ext
    const folder_id = req.query.id
    const readFile = util.promisify(fs.readFile)
    const fullPath = path.join(__dirname, '..', 'someDirectory', fileFullName)
    const file_to_upload = await readFile(`${fullPath}`)

    try {
      const uploaded_file = await axios.post(`${my-target-baseURL.com}/elements/api/files?path=%2F${fileFullName}&folderId=${folder_id}`,
      file_to_upload,
      { headers: { 'accept': 'application/json', Authorization: `SomeHeader xyz, OtherHeader xyz`, 
      'content-type':'multipart/form-data',},
    })
      console.log('uploaded_file: ', uploaded_file.data)
    }
    catch(error) {
        throw new Error(error)
    }

执行此操作时,出现500错误(Unhandled promise rejection (rejection id: 2): Error: Error: Request failed with status code 500)。

这里要提到的一件事是,我读取文件的方式工作正常。我之所以这样说,是因为这段代码曾经像这样读取文件并命中另一个API并获得了响应,而没有任何问题。

我找不到导致此问题的原因。我将curl转换为axios调用的方式有问题吗?我是否正确进行了-F "file=@my-file.png;type=image/png"的转换?

1 个答案:

答案 0 :(得分:0)

这对我来说很好,您可以在尝试并添加结果时将请求复制为CURL吗?

将报头拆分成类似

的方法也更干净
const headers = {
    'Accept': 'application/json', 
    'Authorization': `SomeHeader xyz, OtherHeader xyz`,
    'Content-Type':'multipart/form-data'
    }

然后做

await axios.post(`${my-target-baseURL.com}/elements/api/files?path=%2F${fileFullName}&folderId=${folder_id}`,
      file_to_upload,
      {headers});