Hablemos de carga de archivos. Ya sea que esté creando el próximo Instagram, un CMS o cualquier aplicación que involucre contenido generado por el usuario, necesitará manejar archivos. Hoy nos sumergimos en el mundo de la carga de archivos con Go. Configuraremos un servicio de carga de archivos simple que puede almacenar archivos localmente y, para darle un toque extra, incluso lo conectaremos a Amazon S3 para que pueda pasar al modo de nube completa. ?️
Aquí está el plan de juego:
¡Toma tu café y vámonos! ☕
Lo primero es lo primero: configuremos un servidor HTTP básico con un punto final /upload. Para esto, nos atenemos al paquete net/http integrado de Go porque es sencillo y fácil de usar.
Abre tu editor favorito, crea un archivo main.go y configura un 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)) }
Ahora vayamos a la parte divertida: ¡manejar la carga de archivos! Crearemos una función fileUploadHandler que manejará los archivos entrantes y los almacenará en un directorio 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(10Aquí está la verdad:
Creemos la función auxiliar createFile que maneja dónde van nuestros archivos:
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 }
¡La seguridad es clave! Agreguemos un poco de validación para que solo los tipos de archivos aprobados pasen.
¿Quieres mantenerlo seguro? Restrinjamos las cargas a imágenes. Así es 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) } }
El almacenamiento local está bien y todo, pero si quieres escalar, ¡S3 es donde está! Conectemos su servicio de carga de archivos a Amazon S3 para que pueda almacenar archivos en la nube.
Para trabajar con S3, necesitará el SDK de AWS:
go get -u github.com/aws/aws-sdk-go/aws go get -u github.com/aws/aws-sdk-go/service/s3
Configuremos una función para conectarnos a su depósito 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 }
Reemplace "su-nombre-de-depósito" con el nombre real de su depósito de S3. Ahora, modifiquemos nuestro controlador de carga para usar esta función.
Actualice fileUploadHandler para almacenar el archivo en S3 en lugar 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!") }
¡Y listo! Ahora tiene un servicio de carga de archivos que admite almacenamiento local y almacenamiento en la nube a través de Amazon S3. ?
Para probar el servicio de carga, puedes usar curl:
curl -X POST http://localhost:8080/upload -F "myFile=@path/to/your/file.jpg"
O, si prefieres una interfaz gráfica, crea un formulario HTML rápido:
Sube un archivo y deberías verlo guardado localmente o en tu depósito de S3.
Crear un servicio de carga de archivos es una excelente manera de agregar funcionalidad y aprender sobre el manejo, la validación e incluso el almacenamiento en la nube de archivos. Ahora que ya dominas los conceptos básicos, piensa en lo que sigue: ya sea cambiar el tamaño de la imagen, procesar videos o manejar tipos de archivos más grandes, ¡el cielo es el límite!
¿Has creado un servicio de carga de archivos antes? Deja un comentario a continuación con tus consejos o cuéntame qué te gustaría ver a continuación. ¡Feliz codificación!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3