kintone.proxy.upload()を使用して、コラボフローAPIで申請書の添付ファイルパーツにファイルをアップロードしようとしております。
こちらを参考に実装し、エラーもなく処理は成功したのですが、アップロードされたファイルのファイル名が日本語の場合、文字化けが発生してしまいます。
例:サンプル.pdf → ����.pdf
日本語ファイル名も正しく表示させるには、どのような修正が必要でしょうか。
プログラム初心者のため、問題点も見当がつかない状態で困っております。
恐れ入りますが、ご教授いただけますと幸いです。
現在のコードは以下の通りです。
async function downloadFile({ fileKey }) {
const url = `/k/v1/file.json?fileKey=${fileKey}`;
const headers = { "X-Requested-With": "XMLHttpRequest" };
const res = await fetch(url, { headers });
return res.arrayBuffer();
}
function stringToArrayBuffer(string) {
const arrayBuffer = new ArrayBuffer(string.length);
const uint8 = new Uint8Array(arrayBuffer);
return uint8.map((_, i) => string.charCodeAt(i)).buffer;
};
function mergeArrayBuffer(ab1, ab2) {
const uint8 = new Uint8Array(ab1.byteLength + ab2.byteLength);
uint8.set(new Uint8Array(ab1), 0);
uint8.set(new Uint8Array(ab2), ab1.byteLength);
return uint8.buffer;
};
function getPostData({ boundary, body, filename }) {
let headerString = "";
headerString += `--${boundary}\r`;
headerString += `Content-Disposition: form-data; name="file"; filename="${filename}"\r`;
headerString += "Content-Type: application/octet-stream;\r";
headerString += "\r";
let footerString = "";
footerString += "\r";
footerString += `--${boundary}--`;
const header = stringToArrayBuffer(headerString);
const footer = stringToArrayBuffer(footerString);
return [header, body, footer].reduce((ac, cu) => mergeArrayBuffer(ac, cu));
};
async function uploadFile(arrayBuffer) {
const url = `https://{URL}/api/index.cfm/v1/files`;
const params = {
"X-Collaboflow-Authorization": `{accessToken}`,
"Content-Type": `multipart/form-data; boundary="boundary"; charset=UTF-8`,
};
const data = { format: "RAW", value: new Blob([arrayBuffer]) };
const resp = await kintone.proxy.upload(url, "POST", params, data);
const status = resp[1];
const responseBody = JSON.parse(resp[0]);
if (status !== 201) {
throw { message: `${responseBody.messages.join('')}` };
}
return JSON.parse(resp[0]);
}
async function apply(requestBody) {
const url = `https://{URL}/api/index.cfm/v1/documents`;
const header = {
'X-Collaboflow-Authorization': `{accessToken}`,
'Content-Type': 'application/json'
}
const resp = await kintone.proxy(url, 'POST', header, requestBody);
const status = resp[1];
const responseBody = JSON.parse(resp[0]);
if (status !== 201) {
throw { message: `${responseBody.messages.join('')}` };
}
return responseBody;
}
kintone.events.on('app.record.create.submit', function (event) {
const file= event.record.file.value;
const downloadFileKey = file[0].fileKey;
const body = await downloadFile({fileKey: downloadFileKey});
const filename = file[0].name;
const boundary = "boundary";
const kintoneFileData = getPostData({ boundary, body, filename });
const fileResp = await uploadFile(kintoneFileData);
const requestBody = {
'processes_id': {processId},
'app_cd': 1,
'document': {
"{PARTSID_Attachment}": fileResp.id
}
};
await apply(requestBody);
return event;
});
以上、よろしくお願い致します。