adonisJS / 파일 다운로드 컨트롤러 만들기

flobeeee·2022년 4월 29일
0

시행착오

목록 보기
37/45
post-custom-banner

1. 공식문서

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

2. 최종 api

파일은 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))

3. 시행착오

시도 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)}`) 

한글 인코딩을 해줘야했다.

profile
기록하는 백엔드 개발자
post-custom-banner

0개의 댓글