"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go에서 파일 업로드 서비스 구축

Go에서 파일 업로드 서비스 구축

2024-11-07에 게시됨
검색:705

Building a File Upload Service in Go

파일 업로드에 대해 이야기해 보겠습니다. 차세대 Instagram, CMS 또는 사용자 생성 콘텐츠와 관련된 앱을 구축하는 경우 파일을 처리해야 합니다. 오늘 우리는 Go를 사용하여 파일 업로드의 세계로 뛰어들고 있습니다. 파일을 로컬에 저장할 수 있는 간단한 파일 업로드 서비스를 설정하고, 약간의 추가 기능을 위해 이를 Amazon S3에 연결하여 전체 클라우드 모드로 전환할 수도 있습니다. ?️

게임 계획은 다음과 같습니다.

  1. 간단한 파일 업로드 엔드포인트를 설정합니다.
  2. 파일을 처리하고 로컬에 저장하며 모든 것이 작동하는지 확인합니다.
  3. 보안을 유지하기 위해 몇 가지 기본 유효성 검사를 추가했습니다.
  4. 그리고 S3 스토리지로 한 단계 더 발전할 예정입니다.

커피를 마시고 출발하세요! 🔥


1단계: 파일 업로드 엔드포인트 구축

먼저 먼저 /upload 엔드포인트를 사용하여 기본 HTTP 서버를 설정해 보겠습니다. 이를 위해 우리는 Go의 내장 net/http 패키지가 간단하고 사용하기 쉽기 때문에 이를 고수하고 있습니다.

서버 설정

좋아하는 편집기를 열고, main.go 파일을 만들고, 기본 서버를 설정하세요:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/upload", fileUploadHandler)

    fmt.Println("Server running on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

업로드 핸들러 생성

이제 재미있는 부분인 파일 업로드 처리를 시작해 보겠습니다. 들어오는 파일을 처리하고 이를 로컬 디렉터리에 저장하는 fileUploadHandler 함수를 생성하겠습니다.

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // Limit file size to 10MB. This line saves you from those accidental 100MB uploads!
    r.ParseMultipartForm(10 



내요는 다음과 같습니다.

  • r.FormFile("myFile")을 사용하여 양식에서 파일을 가져옵니다.
  • 파일을 얻은 후 로컬 파일을 열거나 생성하고 내용을 복사합니다.
  • 이 설정은 로컬 스토리지, 빠른 프로토타입 또는 아직 클라우드 스토리지를 사용할 준비가 되지 않은 프로젝트에 적합합니다.

로컬에 파일 저장

파일 위치를 처리하는 도우미 함수 createFile을 만들어 보겠습니다.

import (
    "os"
    "path/filepath"
)

func createFile(filename string) (*os.File, error) {
    // Create an uploads directory if it doesn’t exist
    if _, err := os.Stat("uploads"); os.IsNotExist(err) {
        os.Mkdir("uploads", 0755)
    }

    // Build the file path and create it
    dst, err := os.Create(filepath.Join("uploads", filename))
    if err != nil {
        return nil, err
    }

    return dst, nil
}

2단계: 파일 유효성 검사 및 보안 ?️

보안이 핵심입니다! 승인된 파일 형식만 통과할 수 있도록 약간의 유효성 검사를 추가하겠습니다.

MIME 유형 확인

안전하게 보관하고 싶으신가요? 이미지 업로드를 제한하겠습니다. 방법은 다음과 같습니다.

import (
    "io/ioutil"
    "strings"
)

func isValidFileType(file []byte) bool {
    fileType := http.DetectContentType(file)
    return strings.HasPrefix(fileType, "image/") // Only allow images
}

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // [Existing code here]

    // Read the file into a byte slice to validate its type
    fileBytes, err := ioutil.ReadAll(file)
    if err != nil {
        http.Error(w, "Invalid file", http.StatusBadRequest)
        return
    }

    if !isValidFileType(fileBytes) {
        http.Error(w, "Invalid file type", http.StatusUnsupportedMediaType)
        return
    }

    // Proceed with saving the file
    if _, err := dst.Write(fileBytes); err != nil {
        http.Error(w, "Error saving the file", http.StatusInternalServerError)
    }
}

3단계: S3를 통해 클라우드로 전환 ☁️

로컬 스토리지도 괜찮지만 확장을 원할 경우 S3가 적합합니다! 클라우드에 파일을 저장할 수 있도록 파일 업로드 서비스를 Amazon S3에 연결해 보겠습니다.

AWS SDK 설치

S3를 사용하려면 AWS SDK가 필요합니다:

go get -u github.com/aws/aws-sdk-go/aws
go get -u github.com/aws/aws-sdk-go/service/s3

S3 클라이언트 구성

S3 버킷에 연결하는 기능을 설정해 보겠습니다.

import (
    "bytes"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func uploadToS3(file []byte, filename string) error {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-west-1"), // Your AWS region
    })
    if err != nil {
        return err
    }

    s3Client := s3.New(sess)
    _, err = s3Client.PutObject(&s3.PutObjectInput{
        Bucket: aws.String("your-bucket-name"),
        Key:    aws.String(filename),
        Body:   bytes.NewReader(file),
        ACL:    aws.String("public-read"),
    })
    return err
}

"your-bucket-name"을 실제 S3 버킷 이름으로 바꾸세요. 이제 이 기능을 사용하도록 업로드 핸들러를 조정해 보겠습니다.

업로드 핸들러 수정

fileUploadHandler를 업데이트하여 파일을 로컬 대신 S3에 저장합니다.

func fileUploadHandler(w http.ResponseWriter, r *http.Request) {
    // [Existing code here]

    if err := uploadToS3(fileBytes, handler.Filename); err != nil {
        http.Error(w, "Error uploading to S3", http.StatusInternalServerError)
        return
    }
    fmt.Fprintf(w, "File successfully uploaded to S3!")
}

그리고 그게 다야! 이제 Amazon S3를 통해 로컬 스토리지와 클라우드 스토리지를 모두 지원하는 파일 업로드 서비스가 제공됩니다. ?


그것을 테스트 하시겠습니까?

업로드 서비스를 테스트하려면 컬을 사용할 수 있습니다.

curl -X POST http://localhost:8080/upload -F "myFile=@path/to/your/file.jpg"

또는 그래픽 인터페이스를 선호하는 경우 빠른 HTML 양식을 만드세요.

파일을 업로드하면 로컬이나 S3 버킷에 저장된 것을 확인할 수 있습니다.


마무리

파일 업로드 서비스를 구축하는 것은 기능을 추가하고 파일 처리, 유효성 검사, 심지어 클라우드 저장소까지 배울 수 있는 좋은 방법입니다. 이제 기본 사항을 익혔으니 다음 단계에 대해 생각해 보세요. 이미지 크기 조정, 비디오 처리, 더 큰 파일 형식 처리 등 무한한 가능성이 있습니다!

이전에 파일 업로드 서비스를 구축해 보셨나요? 아래에 팁을 댓글로 남겨주시거나 다음에 보고 싶은 내용을 알려주세요. 즐거운 코딩하세요!

릴리스 선언문 이 글은 https://dev.to/neelp03/building-a-file-upload-service-in-go-34fj?1 에서 복제되었습니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3