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

NodeJS调用Jira Rest API上传附件报Header字节超限错误求助

用Node.js上传Buffer到Jira REST API时触发FileUploadException错误

问题描述

我正在用NodeJS尝试通过Jira Rest API向工单上传附件,API要求采用multipart/form-data格式,以下是我的调用代码:

function uploadAttachments(supportFormData, callback) { 
  const url = 'https://somewhere.com/jira/rest/api/2/issue/' + supportFormData.issueId + '/attachments'; 
  var options = { 
    url: url, 
    headers: { 
      Authorization: { user: username, password: password }, 
      'X-Atlassian-Token': 'nocheck' 
    } 
  }; 

  var r = request.post(options, function(err, res, body) { 
    if (err) { 
      console.error(err); 
      callback(false); 
    } else { 
      console.log('Upload successful! Server responded with:', body); 
      callback(false); 
    } 
  }); 

  var form = r.form(); 
  form.append('file', supportFormData.attachments[0].contents, { 
    filename: supportFormData.attachments[0].fileName, 
    contentType: supportFormData.attachments[0].contents 
  }); 
}

运行后收到的错误信息:

org.apache.commons.fileupload.FileUploadException: Header section has more than 10240 bytes (maybe it is not properly terminated)

其中supportFormData.attachments[0].contents的类型为Buffer,请问可能是什么原因导致该错误?


问题分析与解决方案

这个错误的核心原因非常明确:你把contentType参数的值错误地设置成了Buffer本身,而不是文件对应的MIME类型。

当request库构造multipart/form-data请求的头部时,它会把你传入的Buffer当作字符串来处理——这就相当于把整个文件的二进制数据塞进了请求头里,直接超出了Jira服务器限制的10240字节的头部大小阈值,自然就触发了这个异常。

除此之外,你的Authorization头写法也不符合request库的规范,这可能会导致认证失败,我一起帮你修正:

修正后的代码

function uploadAttachments(supportFormData, callback) { 
  const url = 'https://somewhere.com/jira/rest/api/2/issue/' + supportFormData.issueId + '/attachments'; 
  var options = { 
    url: url, 
    headers: { 
      'X-Atlassian-Token': 'nocheck' 
    },
    // 用request库原生的auth字段处理Basic认证,比手动构造headers更可靠
    auth: {
      user: username,
      pass: password
    }
  }; 

  var r = request.post(options, function(err, res, body) { 
    if (err) { 
      console.error(err); 
      callback(false); 
    } else { 
      console.log('Upload successful! Server responded with:', body); 
      callback(true); // 原代码这里错误传了false,应该用true标识上传成功
    } 
  }); 

  var form = r.form(); 
  const attachment = supportFormData.attachments[0];
  form.append('file', attachment.contents, { 
    filename: attachment.fileName, 
    // 替换成对应文件的MIME类型,比如image/png、text/plain,不确定就用通用类型
    contentType: 'application/octet-stream' 
  }); 
}

额外注意事项

  • 根据实际文件类型调整contentType:比如图片用image/jpeg或image/png,PDF用application/pdf,如果不确定文件类型,application/octet-stream是通用的二进制文件类型。
  • 如果有多个附件,记得用循环遍历supportFormData.attachments数组,逐个调用form.append。
  • 可以借助request-debug工具打印完整的请求内容,确认请求头没有混入二进制数据,确保格式正确。

内容的提问来源于stack exchange,提问作者Kieran Quinn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:21:02