Csv出力機能を実装したい
Q&A
解決したいこと
CSV出力機能を実装したい
APIたたいた時点で自動でブラウザにCSVが出力される機能
仕様技術 vue.js
ライブラリ axios
解決方法を教えて下さい。
発生している問題・エラー
response.headerの中にfileNameが見当たらない
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
API呼んでいる箇所
/**
* postMigrationItem
* @description 移行情報csvをダウンロード
* @param requestId
* @returns { Promise<void>}
*/
const postMigrationItem = async (requestId: number | null): Promise<any> => {
try {
const response = await apiClient.post(`/migration/file/${requestId}`)
const url = window.URL.createObjectURL(new Blob([response.data]))
const link = document.createElement('a')
link.href = url
const contentDisposition = response.headers['Content-Disposition']
const contentType = response.headers['Content-Type']
console.log('contentHeaders:', response.headers)
console.log('contentDisposition:', contentDisposition)
console.log('contentType:', contentType)
const fileName = contentDisposition
? contentDisposition.split('filename=')[1]
: 'download.csv'
console.log('fileName:', fileName)
link.setAttribute('download', fileName)
document.body.appendChild(link)
link.click()
link.remove()
} catch (error: unknown) {
throw new Error('postMigrationItemでエラーが発生しました。')
}
}
const baseHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
const requestId = Number(event.pathParameters?.requestId);
if (!event.pathParameters?.requestId) {
return createResponse(JSON.stringify({ error: 'Invalid or missing requestId' }));
}
const result = await transferDownload(requestId);
console.log('result.base64Data:', result.base64Data)
console.log('result.csvFileName:', result.csvFileName)
if (result) {
return createBinaryCsvResponse(result.base64Data, result.csvFileName);
} else {
return createResponse(
JSON.stringify({
statusCode: 201,
body: JSON.stringify({ message: 'Nothing update transfer date by requestIds' }),
}),
);
}
};
export const lambdaHandler = middy(baseHandler).use(httpErrorHandlerMiddleware());
export function createBinaryCsvResponse(body: string, fileName: string) {
return {
statusCode: 200,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers':
'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Content-Type': 'text/csv',
'Content-Disposition': `attachment; filename='${fileName}'`,
},
body: body,
isBase64Encoded: true,
};
}
自分で試したこと
・デバッガーでログの検証
・const contentDisposition = response.headers['Content-Disposition'] const contentType = response.headers['Content-Type']
の部分を小文字に変更→変化なし