[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.)