【axios】S3の署名付きURLを使ってcsvをダウンロードする際に同時にファイル名を取得する方法について
Q&A
Closed
バージョン
axios 0.21.2
解決したいこと
ブラウザでダウンロードボタンを押下した際に署名付きURLを使ってcsvファイルをダウンロードするのですが、
良いファイル名の取得方法が思いつきません。
今は以下のようにURIからファイル名を取得して対応しています。
const getFileNameFromUri = (uri:string) => {
const removedQueryParam = uri.substring(path.indexOf('?'),0);
const fileName = removedQueryParam.substring(removedQueryParam.lastIndexOf('/') + 1);
return fileName;
}
// ここが本当は署名付きURL
const uri = "https://www.city.sakura.lg.jp/section/tokei/download/csv/0101000000.csv";
const responseType = {
responseType: "blob"
}
// uriからファイル名を取得
const fileName = getFileNameFromUri(uri);
// ファイル名に日本語が含まれていることを想定してデコード
const decodedFileName = decodeURI(fileName)
// ファイルを取得
const response = await axios.get(uri, responseType);
// responseからblobオブジェクトを作成
const blob = new Blob([response.data]);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
document.body.appendChild(a);
a.href = url;
// ファイル名を指定
a.setAttribute('download', decodedFileName);
document.body.appendChild(a);
// クリックしてダウンロード
a.click();
a.remove();
// メモリリーク対策
URL.revokeObjectURL(url);
この方法は無理やり感があり、良い方法ではないように感じています。
axiosのレスポンスにファイル名を含めることはできないのでしょうか。
今回のURIでは「0101000000.csv」を取得することは難しいのでしょうか。ファイル名のテキスト情報が取れているのにファイル名が取れないことに違和感があり取れるのでないかと調査しているのですが詰まり始めています。
以上です。
お力添えいただけますと幸いです。よろしくお願いいたします。
0