You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Axios发送POST请求上传本地文件报错,求正确实现方式

解决Axios上传PDF文件返回Bad Request的问题

你的核心问题是curl的--data-binary是直接将文件内容作为原始二进制请求体发送,而你用可读流传递给Axios时,没有匹配curl的请求格式,再加上可能的header键名大小写问题,导致API返回Bad Request。

正确实现方式(优先方案)

直接读取文件为Buffer,作为Axios的data字段传递,这样能完全匹配curl的--data-binary行为:

const fs = require('fs').promises;
const axios = require('axios');

async function uploadPdf(transaction) {
    try {
        const transactionid = transaction.id;
        // 读取文件为二进制Buffer
        const receiptBuffer = await fs.readFile(`/home/files/receipts/${transaction.fileName}`);
        
        const { data } = await axios({
            baseURL: BASE_URL,
            method: 'post',
            url: API_URL,
            headers: {
                'tokenId': TOKEN, // 注意:curl中的header是tokenId,需和API要求的键名大小写完全一致
                'Origin': HEADER_ORIGIN,
                'Content-Type': 'application/pdf',
                'transactionId': transactionid 
            },
            data: receiptBuffer
        });
        console.log(data);
    } catch (error) {
        // 打印更详细的错误信息,方便排查
        console.error('上传失败:', error.response?.data || error.message);
        console.error('响应状态码:', error.response?.status);
    }
}

关键注意事项

  1. Header键名大小写匹配:你之前的代码中写的是tokenid,但curl命令里是tokenId,很多API对Header键名的大小写是敏感的,这很可能是导致Bad Request的直接原因。
  2. 用Buffer替代可读流:Axios处理Buffer类型的data时,会直接将其作为原始二进制请求体发送,和curl的--data-binary逻辑完全一致。而可读流在Axios中需要额外配置分块传输(不是所有API都支持),可靠性更低。

可选方案:使用可读流(需API支持分块传输)

如果必须用可读流,需要添加Transfer-Encoding: chunked header,但仅适用于支持分块传输的API:

async function uploadPdf(transaction) {
    try {
        const transactionid = transaction.id;
        const receipts = fs.createReadStream(`/home/files/receipts/${transaction.fileName}`);
        
        const { data } = await axios({
            baseURL: BASE_URL,
            method: 'post',
            url: API_URL,
            headers: {
                'tokenId': TOKEN,
                'Origin': HEADER_ORIGIN,
                'Content-Type': 'application/pdf',
                'transactionId': transactionid,
                'Transfer-Encoding': 'chunked' // 启用分块传输
            },
            data: receipts,
            maxContentLength: Infinity // 避免流过大触发长度限制
        });
        console.log(data);
    } catch (error) {
        console.error('上传失败:', error.response?.data || error.message);
    }
}

调试建议

  • 捕获错误时,打印error.response的详细信息,API通常会在响应体里说明具体的错误原因(比如header错误、请求体格式不对)。
  • 用抓包工具(如Wireshark、Charles)对比curl和Axios发送的请求,检查header、请求体的差异。

内容的提问来源于stack exchange,提问作者Fairuz Yassar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:05:15