【问题标题】:Node axios not sending correct header: 'Content-Type': 'multipart/form-data'节点 axios 未发送正确的标头:“Content-Type”:“multipart/form-data”
【发布时间】:2022-02-15 14:14:33
【问题描述】:

我正在尝试使用HubSpot docs 中提供的节点示例上传文件。

我收到415(Unsupported media type)。响应说我正在发送标头application/json,即使我正在设置multipart/form-data

const uploadFile = async () => {    

    const postUrl = `https://api.hubapi.com/filemanager/api/v3/files/upload?hapikey=${HAPI_KEY}`;

    const filename = `${APP_ROOT}/src/Files/Deal/4iG_-_CSM_Additional_Capacity/test.txt`;

    const headers = {
        'Content-Type': 'multipart/form-data'
    }

    var fileOptions = {
        access: 'PUBLIC_INDEXABLE',
        overwrite: false,
        duplicateValidationStrategy: 'NONE',
        duplicateValidationScope: 'ENTIRE_PORTAL'
    };

    var formData = {
        file: fs.createReadStream(filename),
        options: JSON.stringify(fileOptions),
        folderPath: '/Root'
    };

    try {
        const resp = await axios.post(postUrl, formData, headers); // API request

        console.log(resp.data)
    } catch (error) {
        console.log("Error: ", error);
    }
}

您能看到问题所在或推荐一种更好的上传文件的方法吗?

谢谢!

【问题讨论】:

    标签: javascript node.js axios fs hubspot-api


    【解决方案1】:

    您链接到的 Node 示例使用(已弃用)request module,而不是 Axios。

    要使用 Axios (source),您可以将其重写为:

    const FormData = require('form-data');
     
    const form = new FormData();
    form.append('file', fs.createReadStream(filename));
    form.append('options', JSON.stringify(fileOptions));
    form.append('folderPath', '/Root');
    
    const config = { headers: form.getHeaders() };
    
    axios.post(postUrl, form, config);
    

    【讨论】:

    • 我试过了,但我得到了同样的错误响应。当文档需要标头 ''Content-Type': 'multipart/form-data'' 时,此方法将标头设置为 ''Content-Type': 'application/x-www-form-urlencoded'
    • @Larney — 当我运行该代码时,它会设置正确的内容类型 — imgur.com/a/gIYo9jC —(它指向一个回显标题的测试 URL)。你一定错过了什么。
    • 嗯,我复制了你的解决方案,但我仍然得到 content-type: application/x-www-form-urlencoded
    【解决方案2】:

    我们可以在 Postman 中运行 API 并检查 NodeJs - Postman 代码片段中的 Axios 详细信息,我认为这是更好的方法。

    const axios = require('axios');
    const FormData = require('form-data');
    const fs = require('fs');
    
    const uploadFile = async () => {
        try {
            let data = new FormData();
            data.append('folderPath', '/Root');
            form.append('file', fs.createReadStream(`${APP_ROOT}/src/Files/Deal/4iG_-_CSM_Additional_Capacity/test.txt`));
            data.append('options', JSON.stringify({
                access: 'PUBLIC_INDEXABLE',
                overwrite: false,
                duplicateValidationStrategy: 'NONE',
                duplicateValidationScope: 'ENTIRE_PORTAL'
            }));
            
            var config = {
                method: 'post',
                url: `https://api.hubapi.com/filemanager/api/v3/files/upload?hapikey=${HAPI_KEY}`,
                headers: {
                    'Content-Type': 'multipart/form-data'
                },
                data: data
            };
            
            const resp = await axios(config); // API request
            console.log(resp.data)
        } catch (error) {
            // error
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 2021-08-28
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2019-05-27
      • 2022-07-23
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多