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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:32:06