"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Construindo um serviço de upload de arquivos em Go

Construindo um serviço de upload de arquivos em Go

Publicado em 2024-11-07
Navegar:514

Building a File Upload Service in Go

Vamos conversar sobre upload de arquivos. Esteja você construindo o próximo Instagram, um CMS ou qualquer aplicativo que envolva conteúdo gerado pelo usuário, você precisará gerenciar arquivos. Hoje, estamos mergulhando no mundo dos uploads de arquivos com Go. Configuraremos um serviço simples de upload de arquivos que pode armazenar arquivos localmente e, para dar um toque extra, vamos até conectá-lo ao Amazon S3 para que você possa usar o modo de nuvem total. ?️

Aqui está o plano de jogo:

  1. Configurando um endpoint de upload de arquivo simples.
  2. Manusear arquivos, armazená-los localmente e garantir que tudo funcione.
  3. Adicionando alguma validação básica para manter as coisas seguras.
  4. E então, estamos indo além com o armazenamento S3.

Pegue seu café e vamos embora! ☕


Etapa 1: construindo o endpoint de upload de arquivo

Comecemos pelo princípio: vamos configurar um servidor HTTP básico com um endpoint /upload. Para isso, optamos pelo pacote net/http integrado do Go porque é simples e fácil de usar.

Configuração do servidor

Abra seu editor favorito, crie um arquivo main.go e configure um servidor básico:

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

Criando o manipulador de upload

Agora vamos para a parte divertida: lidar com uploads de arquivos! Criaremos uma função fileUploadHandler que irá lidar com os arquivos recebidos e armazená-los em um diretório local.

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 



Aqui está o resumo:

  • Estamos pegando o arquivo do formulário com r.FormFile("myFile").
  • Depois de obtermos o arquivo, abrimos (ou criamos) um arquivo local e copiamos o conteúdo.
  • Essa configuração é ótima para armazenamento local, protótipos rápidos ou projetos que ainda não estão prontos para armazenamento em nuvem.

Salvando o arquivo localmente

Vamos criar a função auxiliar createFile que controla para onde vão nossos arquivos:

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
}

Etapa 2: Validando e protegendo seus arquivos ?️

Segurança é fundamental! Vamos adicionar um pouco de validação para que apenas os tipos de arquivo aprovados sejam aprovados.

Validando o tipo MIME

Quer mantê-lo seguro? Vamos restringir uploads de imagens. Veja como:

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

Etapa 3: Levando para a nuvem com S3 ☁️

O armazenamento local é bom e tudo, mas se você quiser escalar, o S3 é onde está! Vamos conectar seu serviço de upload de arquivos ao Amazon S3 para que você possa armazenar arquivos na nuvem.

Instale o SDK da AWS

Para trabalhar com S3, você precisará do AWS SDK:

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

Configurar o cliente S3

Vamos configurar uma função para conectar ao seu bucket 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
}

Substitua "your-bucket-name" pelo nome real do bucket S3. Agora, vamos ajustar nosso manipulador de upload para usar esta função.

Modifique o manipulador de upload

Atualize fileUploadHandler para armazenar o arquivo no S3 em vez de localmente:

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

E é isso! Agora você tem um serviço de upload de arquivos que oferece suporte ao armazenamento local e ao armazenamento em nuvem por meio do Amazon S3. ?


Testando?

Para testar o serviço de upload, você pode usar curl:

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

Ou, se preferir uma interface gráfica, crie um formulário HTML rápido:

Faça upload de um arquivo e você deverá vê-lo salvo localmente ou em seu bucket S3.


Concluindo

Criar um serviço de upload de arquivos é uma ótima maneira de adicionar funcionalidades e aprender sobre manipulação de arquivos, validação e até mesmo armazenamento em nuvem. Agora que você já conhece o básico, pense no que vem a seguir – seja redimensionamento de imagem, processamento de vídeo ou manipulação de tipos de arquivos maiores, o céu é o limite!

Você já criou um serviço de upload de arquivos antes? Deixe um comentário abaixo com suas dicas ou deixe-me saber o que você gostaria de ver a seguir. Boa codificação!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/neelp03/building-a-file-upload-service-in-go-34fj?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3