如何将Jira API获取的二进制文件转换为正常文件?
解决Jira REST API取回附件文件损坏的问题
核心原因
问题根源是将二进制文件内容错误地以UTF-8文本编码处理。Jira返回的附件是原始二进制流,但请求客户端可能自动将其解析为UTF-8字符串——二进制数据(比如PDF中的图片、图形压缩流)包含大量非UTF-8合法字节,这些字节会被强制替换为�等占位符,写入文件时无法还原,导致带复杂内容的文件损坏。
正确处理方案
解决关键是直接获取并处理原始二进制数据,跳过文本编码转换。以下是主流HTTP客户端的正确实现:
1. 使用Axios
设置responseType: 'arraybuffer'让客户端直接返回二进制缓冲区:
const axios = require('axios'); const fs = require('fs'); async function getJiraAttachment(attachmentId) { const response = await axios.get(`/rest/api/3/attachment/content/${attachmentId}`, { responseType: 'arraybuffer', // 关键:指定返回二进制数据 auth: { username: '你的用户名', password: '你的API令牌' } }); // 直接写入缓冲区,无需额外编码转换 fs.writeFileSync('attachment.pdf', response.data); }
2. 使用Node-Fetch
通过arrayBuffer()获取原始二进制数据:
const fetch = require('node-fetch'); const fs = require('fs'); async function getJiraAttachment(attachmentId) { const response = await fetch(`/rest/api/3/attachment/content/${attachmentId}`, { headers: { 'Authorization': 'Basic ' + Buffer.from('你的用户名:你的API令牌').toString('base64') } }); const buffer = Buffer.from(await response.arrayBuffer()); fs.writeFileSync('attachment.pdf', buffer); }
3. 使用Node.js原生HTTP模块
设置响应编码为null以获取原始二进制:
const http = require('http'); const fs = require('fs'); const options = { hostname: '你的Jira域名', path: `/rest/api/3/attachment/content/${attachmentId}`, headers: { 'Authorization': 'Basic ' + Buffer.from('你的用户名:你的API令牌').toString('base64') } }; http.get(options, (res) => { res.setEncoding(null); // 关键:不进行文本编码 const chunks = []; res.on('data', (chunk) => chunks.push(chunk)); res.on('end', () => { const buffer = Buffer.concat(chunks); fs.writeFileSync('attachment.pdf', buffer); }); });
原有代码失败原因
你之前的代码:
const pdfBuffer = Buffer.from(data.output, 'utf-8'); fs.writeFileSync(filename, pdfBuffer, { encoding: 'binary' });
data.output已经是被错误解析为UTF-8的字符串,其中无效字节已被替换,无法还原。- 即使后续用
binary编码写入,丢失的二进制信息也无法恢复。
验证要点
- 检查响应头的
Content-Type,应为对应文件类型(如application/pdf、image/png),而非text/plain。 - 对比响应头的
Content-Length和写入文件的大小,两者应完全一致,否则说明数据丢失。
内容的提问来源于stack exchange,提问作者frostzt
相关产品推荐
相关产品推荐

