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:
Pegue seu café e vamos embora! ☕
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.
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)) }
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(10Aqui está o resumo:
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 }
Segurança é fundamental! Vamos adicionar um pouco de validação para que apenas os tipos de arquivo aprovados sejam aprovados.
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) } }
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.
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
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.
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. ?
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.
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!
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