API, Javascript

Jira: Axiosでファイルをチケットにアップロードする

Qiitaの記事「Node.js上からmultipart/form-data形式でHTTPリクエストをする」と、JiraのREST APIドキュメント「api/2/issue/{issueIdOrKey}/attachments」を参考に、Axiosを使てJiraのチケットにファイルをアップロードする。

重要なポイントは以下の3つ。

  • form のkeyはfileであること
  • ヘッダにform.getHeaders()を含めること(multipart/form-dataのバウンダリ(データの区切り)を付けるためとのこと:Post Form Data With Axiosより)
  • ヘッダにX-Atlassian-Token: no-check を含めること
import { promises } from 'fs';
import * as FormData from 'form-data';

async function uploadAttachment() {
  const buf = await promises.readFile( "アップロードしたいファイルのパス" );
  const form = new FormData();
  form.append( 'file', buf, 'ファイル名' );

  const res = await axios.post( 'http://<jira_host>/rest/api/2/issue/<ticketKey>/attachments', form, { 
    headers: {
      ...form.getHeaders(),
      'X-Atlassian-Token': 'no-check'
    },
    auth: { ...CREDENTIAL }   // ベーシック認証の場合 username, passwordを与える
  } );
  console.log( res.data );
}

ヘッダには以下のような値が格納される。

headers: {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': 'multipart/form-data; boundary=--------------------------803388439696867273945735',
      'X-Atlassian-Token': 'no-check',
      'User-Agent': 'axios/0.19.2'
}

postの戻り値のdataメンバには以下のような値が格納される。selfのURLを参照すれば、アップロードしたファイルの情報が開ける。

{
  self: 'http://<jira_host>/rest/api/2/attachment/10005',
  id: '10005',
  filename: 'ファイル名',
  author: [Object],
  created: '作成日時',
  size: 154034,
  mimeType: 'image/jpeg',
  content: 'http://<jira_host>/secure/attachment/10005/ファイル名',
  thumbnail: 'http://<jira_host>/secure/thumbnail/10005/_thumb_10005.png'
}

selfのURLでは添付ファイルの情報を取得できる。contentのURLでは、アップロードしたファイルが開ける。

コメントを残す