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
相关产品推荐
相关产品推荐

