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では、アップロードしたファイルが開ける。