kintone.proxy.upload()での日本語ファイル名の文字化けについて

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;
    });

 

以上、よろしくお願い致します。

 

リクエストヘッダですかね:eyes:?日本語だと文字化けしてしまいます。
URLエンコードをすると良いと思います。

ファイル名をencodeURI()してみてください↓
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

ちょうど同じようなことをやりたくてこちらの内容を拝見しました。
原因はファイル名の文字コードがUTF-8になっていないことのようだったので、下記で日本語ファイル名のままアップロードできました。

(1)ライブラリ「encoding japanese」のCDNのURL
https://cdnjs.cloudflare.com/ajax/libs/encoding-japanese/1.0.30/encoding.min.js
をカスタマイズJavascriptに追加

(2)「kintone.events.on」の中の
const filename = file[0].name;

const filename = Encoding.convert(file[0].name, ‘UTF8’, ‘AUTO’);
に変更(ファイル名をUTF-8に)

juridon 様

コメントありがとうございます。

encodeURI()したファイル名でアップロードしたところ、URLエンコードされたファイル名がそのまま表示されてしまいました。
コラボ側でデコード処理がされないようです…。

KAORIN 様

コメントありがとうございます。

(1)ライブラリ「encoding japanese」のCDNのURL
https://cdnjs.cloudflare.com/ajax/libs/encoding-japanese/1.0.30/encoding.min.js
をカスタマイズJavascriptに追加

(2)「kintone.events.on」の中の
const filename = file[0].name;

const filename = Encoding.convert(file[0].name, ‘UTF8’, ‘AUTO’);
に変更(ファイル名をUTF-8に)

こちらの方法で日本語ファイル名のアップロードに成功しました。

非常に助かりました。ありがとうございます!

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。