[Go] echo의 파일 업로드 처리(서버 측)
개시하다
이루어지다
curl http://localhost:8080/upload -F [email protected]
라는 요청을 실행할 때 image_out.png
이미지 파일을 저장하는 처리를 하는 서버를 실시한다.image.png
와 image_out.png
의 내용은 같다.package main
import (
"fmt"
"github.com/labstack/echo/v4"
"io"
"os"
"strings"
)
func upload(c echo.Context) error {
file, err := c.FormFile("file")
if err != nil {
return err
}
src, err := file.Open()
if err != nil {
return err
}
defer src.Close()
fileModel := strings.Split(file.Filename, ".")
fileName := fileModel[0]
extension := fileModel[1]
dst, err := os.Create(fmt.Sprintf("%s_out.%s", fileName, extension))
if err != nil {
return err
}
defer dst.Close()
if _, err = io.Copy(dst, src); err != nil {
return err
}
return c.HTML(200, "Image has been saved.")
}
func main() {
e := echo.New()
e.POST("/upload", upload)
e.Start(":8080")
}
테스트
httptest
패키지를 사용하면 테스트가 실행될 때 서버를 시작하고 시작된 서버에 대한 요청을 실행하여 API의 행위를 확인할 수 있다.echo
를 사용하여 구현된 API도 이 httptest
패키지를 사용하여 테스트할 수 있습니다.설치 예는 다음과 같습니다.package main
import (
"bytes"
"github.com/labstack/echo/v4"
"github.com/stretchr/testify/assert"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"net/http/httptest"
"os"
"testing"
)
func TestUpload(t *testing.T) {
// テストサーバ起動
e := echo.New()
e.POST("/upload", upload)
testServer := httptest.NewServer(e)
defer testServer.Close()
// クライアントの画像ファイルアップロード処理
var buffer bytes.Buffer
writer := multipart.NewWriter(&buffer)
fileWriter, err := writer.CreateFormFile("file", "test.png")
if err != nil{
t.Fatalf("Failed to create file writer. %s", err)
}
readFile, err := os.Open("test.png")
if err != nil {
t.Fatalf("Failed to open file. %s", err)
}
defer readFile.Close()
io.Copy(fileWriter, readFile)
writer.Close()
res, err := http.Post(testServer.URL + "/upload", writer.FormDataContentType(), &buffer)
if err != nil{
t.Fatalf("Failed to POST request. %s", err)
}
// API レスポンス検証
message, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
t.Fatalf("Failed to read HTTP response body. %s", err)
}
assert.Equal(t, "Image has been saved.", string(message))
// アップロードを行った画像ファイルとサーバ側が保存した画像の内容が一致しているかどうか検証
outFile, err := os.Open("test_out.png")
if err != nil {
t.Fatalf("Failed to open file. %s", err)
}
defer outFile.Close()
var expectedBytes []byte
readFile.Write(expectedBytes)
var actualBytes []byte
outFile.Write(actualBytes)
assert.Equal(t, expectedBytes, actualBytes)
}
$ go test -run TestUpload
PASS
ok go-sample 0.116s
Reference
이 문제에 관하여([Go] echo의 파일 업로드 처리(서버 측)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/empenguin/articles/5a2989b37a09d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)