fix: fix file download error

This commit is contained in:
Dayoung 2025-06-05 11:14:25 +09:00
parent a7ea7ce4bc
commit 9801ac4c44
2 changed files with 64 additions and 21 deletions

View File

@ -1,33 +1,73 @@
import axios from 'axios'
import { NextResponse } from 'next/server'
// export async function GET(request: Request) {
// const { searchParams } = new URL(request.url)
// const encodeFileNo = searchParams.get('encodeFileNo')
// const srcFileNm = searchParams.get('srcFileNm')
// if (!encodeFileNo) {
// return NextResponse.json({ error: 'encodeFileNo is required' }, { status: 400 })
// }
// try {
// const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile2`, {
// params: {
// encodeFileNo,
// },
// responseType: 'arraybuffer',
// })
// if (response.headers['content-type'] === 'text/html;charset=utf-8') {
// return NextResponse.json({ error: 'file not found' }, { status: 404 })
// }
// const contentType = response.headers['content-type'] || 'application/octet-stream'
// const contentDisposition = response.headers['content-disposition'] || 'inline'
// return new NextResponse(response.data, {
// status: 200,
// headers: {
// 'Content-Type': contentType,
// 'Content-Disposition': contentDisposition,
// },
// })
// } catch (error: any) {
// console.error('File download error:', error)
// return NextResponse.json({ error: error.response?.data || 'Failed to download file' }, { status: 500 })
// }
// }
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const encodeFileNo = searchParams.get('encodeFileNo')
const srcFileNm = searchParams.get('srcFileNm')
const srcFileNm = searchParams.get('srcFileNm') || 'downloaded-file'
if (!encodeFileNo) {
return NextResponse.json({ error: 'encodeFileNo is required' }, { status: 400 })
}
const url = `${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile2?encodeFileNo=${encodeFileNo}`
try {
const response = await axios.get(`${process.env.NEXT_PUBLIC_INQUIRY_API_URL}/api/file/downloadFile2`, {
responseType: 'arraybuffer',
params: {
encodeFileNo,
},
})
if (response.headers['content-type'] === 'text/html;charset=utf-8') {
return NextResponse.json({ error: 'file not found' }, { status: 404 })
const resp = await fetch(url)
if (!resp.ok) {
return NextResponse.json({ error: 'Failed to download file' }, { status: 500 })
}
return new NextResponse(response.data, {
const contentType = resp.headers.get('content-type') || 'application/octet-stream'
const contentDisposition = resp.headers.get('content-disposition') || `attachment; filename="${srcFileNm}"`
return new NextResponse(resp.body, {
status: 200,
headers: {
'Content-Type': 'application/octet-stream;charset=UTF-8',
'Content-Disposition': `attachment; filename="${srcFileNm}"`,
'Content-Type': contentType,
'Content-Disposition': contentDisposition,
},
})
} catch (error: any) {
return NextResponse.json({ error: error.response.data }, { status: 500 })
console.error('File download error:', error)
return NextResponse.json({ error: error.response?.data || 'Failed to download file' }, { status: 500 })
}
}

View File

@ -76,19 +76,22 @@ export function useInquiry(
const downloadFile = async (encodeFileNo: number, srcFileNm: string) => {
try {
const resp = await axiosInstance(null).get<Blob>(`/api/qna/file`, { params: { encodeFileNo, srcFileNm } })
const blob = new Blob([resp.data], { type: 'application/octet-stream;charset=UTF-8' })
const resp = await fetch(`/api/qna/file?encodeFileNo=${encodeFileNo}&srcFileNm=${srcFileNm}`)
const blob = await resp.blob()
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = `${srcFileNm}`
a.download = srcFileNm
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
URL.revokeObjectURL(url)
return blob
} catch (error: any) {
if (error.response.status === 404) {
alert('ファイルが見つかりません')
}
} catch (error) {
console.error('File download error:', error)
alert('ファイルのダウンロードに失敗しました')
return null
}
}