https://docs.adonisjs.com/guides/drive#downloading-files
// 공식문서 예제
import { extname } from 'path'
import Route from '@ioc:Adonis/Core/Route'
import Drive from '@ioc:Adonis/Core/Drive'
Route.get('/uploads/*', async ({ request, response }) => {
const location = request.param('*').join('/')
const { size } = await Drive.getStats(location)
response.type(extname(location))
response.header('content-length', size)
return response.stream(await Drive.getStream(location))
})
파일은 S3에 저장되어 있는 상태이다.
버튼을 누르면 api가 호출되어 파일 다운로드를 할 수 있는 기능을 만들었다.
const location = file.filePath // file 테이블 filePath 컬럼
const { size } = await Drive.getStats(location)
response.type(extname(location))
response.header('content-length', size)
response.header('content-type', 'application/octet-stream') // 추가된 부분
response.header('content-disposition', `attachment; filename=${encodeURI(file.fileName)}`) // 추가된 부분
return response.stream(await Drive.getStream(location))
시도 1 (다운로드 안됨)
response.header('content-type', 'image/png')
로 content-type을 설정하니
파일다운로드가 되지 않고, 페이지에서 파일이 열렸다.
해결 1
response.header('content-type', 'application/octet-stream')
로 하니 다운로드가 됐다.
시도 2 (다운로드 했을 때, 파일명이 기존 파일명으로 들어가게)
response.header('Content-Disposition', 'attachment; filename="'+file.fileName+'')
fileName이 한글로 들어가 있었다. ex) 테스트.png
Content-Disposition 이 유효하지 않는다는 에러가 떴다.
해결 2
response.header('content-disposition', `attachment; filename=${encodeURI(file.fileName)}`)
한글 인코딩을 해줘야했다.