为Azure DevOps工作项添加PDF附件遇400错误,求解决方案
解决Azure DevOps工作项添加PDF附件时的400错误
问题根源
你遇到的400错误核心原因是上传附件时错误设置了Content-Type:使用FormData上传文件时,axios会自动生成包含boundary的multipart/form-data请求头,而你手动指定Content-Type: application/pdf会破坏请求格式,导致Azure DevOps无法解析上传的内容。
文本文件能正常上传是因为其格式简单,即使请求头有误也可能被兼容解析,但PDF文件的二进制格式对请求格式要求更严格。
修复方案
- 移除上传附件请求中的手动
Content-Type配置,让axios自动处理FormData的请求头 - 确保PDF Blob的MIME类型正确(创建Blob时建议指定
type: 'application/pdf') - 对URL中的
fileName参数进行编码,避免特殊字符导致请求格式错误
修改后的完整代码
export const addPdfAttachmentToWorkItem = async ( workItemId: number, pat: string, organizationUrl: string, projectId: string, pdfBlob: Blob, fileName: string ) => { try { const encodedPat = btoa(`:${pat}`) // 编码文件名,处理特殊字符 const encodedFileName = encodeURIComponent(fileName) const url = `${organizationUrl}/${projectId}/_apis/wit/attachments?api-version=6.0&fileName=${encodedFileName}&uploadType=simple` const formData = new FormData(); // 显式指定文件MIME类型,确保格式正确 formData.append('file', pdfBlob, { filename: fileName, type: 'application/pdf' }); const attachRes = await axios({ method: 'POST', url, data: formData, headers: { Authorization: `Basic ${encodedPat}`, // 移除手动设置的Content-Type,axios自动处理 }, }) const witUrl = `${organizationUrl}/${projectId}/_apis/wit/workitems/${workItemId}?api-version=6.0` const workItemData = [ { op: 'add', path: `/relations/-`, value: { rel: 'AttachedFile', url: attachRes.data.url, attributes: { comment: `Attached work package report for WIT ${workItemId}`, }, }, }, ] const response = await axios.patch(witUrl, workItemData, { headers: { Authorization: `Basic ${encodedPat}`, 'Content-Type': 'application/json-patch+json', }, params: { $expand: 'all', }, }) return response.data } catch (error) { console.error('Error updating work item:', error) throw error } }
错误截图

内容的提问来源于stack exchange,提问作者Smart Solutions
相关产品推荐
相关产品推荐

