echo
프레임워크로 파일 업로더 서버를 구축했다.
쿡북에서 단일 파일, 여러 파일을 업로드하는 예제가 있어 이를 바탕으로 쉽게 만들 수 있었다.
하지만 업로드를 하는 클라이언트에서 폼의 키값을 다른 것으로 하는 경우를 고려해야 했다.
그래서 여러 파일을 업로드하는 코드를 참고하여 입맛에 맞게 수정했다.
func upload(c echo.Context) error {
form, err := c.MultipartForm()
if err != nil {
return err
}
for _, file := range form.File {
// Source
src, err := file[0].Open()
if err != nil {
return err
}
defer src.Close()
// Destination
dst, err := os.Create(file[0].Filename)
if err != nil {
return err
}
defer dst.Close()
// Copy
if _, err = io.Copy(dst, src); err != nil {
return err
}
}
}
그리고 용량이 큰 파일을 업로드하는 경우에 디스크 사용량이 파일 사이즈의 2배가 늘어났다.
원인을 찾아보니 echo
에서 설정한 메모리(32 MB)보다 큰 경우 /tmp/
에 파일을 저장하고 있었다.
다음과 같이 하면 파일을 원하는 곳에 복사한 다음 임시 파일을 모두 제거할 수 있다.
defer func() {
form, err := ctx.MultipartForm()
if err != nil {
return
}
form.RemoveAll()
}()