Lassen Sie uns über Datei-Uploads sprechen. Unabhängig davon, ob Sie das nächste Instagram, ein CMS oder eine andere App mit benutzergenerierten Inhalten erstellen, müssen Sie mit Dateien umgehen. Heute tauchen wir mit Go in die Welt des Datei-Uploads ein. Wir richten einen einfachen Datei-Upload-Dienst ein, der Dateien lokal speichern kann, und verbinden ihn für das gewisse Extra sogar mit Amazon S3, damit Sie in den vollständigen Cloud-Modus wechseln können. ?️
Hier ist der Spielplan:
Holen Sie sich Ihren Kaffee und los geht’s! ☕
Das Wichtigste zuerst: Richten wir einen einfachen HTTP-Server mit einem /upload-Endpunkt ein. Hierfür bleiben wir beim integrierten Net/http-Paket von Go, da es unkompliziert und einfach zu verwenden ist.
Öffnen Sie Ihren bevorzugten Editor, erstellen Sie eine main.go-Datei und richten Sie einen Basisserver ein:
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)) }
Kommen wir nun zum spaßigen Teil: dem Umgang mit Datei-Uploads! Wir erstellen eine fileUploadHandler-Funktion, die eingehende Dateien verarbeitet und sie in einem lokalen Verzeichnis speichert.
func fileUploadHandler(w http.ResponseWriter, r *http.Request) { // Limit file size to 10MB. This line saves you from those accidental 100MB uploads! r.ParseMultipartForm(10Hier sind die Fakten:
Lassen Sie uns die Hilfsfunktion createFile erstellen, die verwaltet, wohin unsere Dateien gehen:
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 }
Sicherheit ist der Schlüssel! Fügen wir eine kleine Validierung hinzu, damit nur genehmigte Dateitypen durchkommen.
Möchten Sie es sicher aufbewahren? Beschränken wir das Hochladen auf Bilder. So geht's:
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) } }
Lokaler Speicher ist in Ordnung, aber wenn Sie skalieren möchten, ist S3 genau das Richtige für Sie! Lassen Sie uns Ihren Datei-Upload-Dienst mit Amazon S3 verbinden, damit Sie Dateien in der Cloud speichern können.
Um mit S3 zu arbeiten, benötigen Sie das AWS SDK:
go get -u github.com/aws/aws-sdk-go/aws go get -u github.com/aws/aws-sdk-go/service/s3
Lassen Sie uns eine Funktion zum Herstellen einer Verbindung zu Ihrem S3-Bucket einrichten:
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 }
Ersetzen Sie „Ihr-Bucket-Name“ durch Ihren tatsächlichen S3-Bucket-Namen. Jetzt optimieren wir unseren Upload-Handler, um diese Funktion zu verwenden.
Aktualisieren Sie fileUploadHandler, damit wir die Datei in S3 statt lokal speichern:
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!") }
Und das ist es! Sie verfügen jetzt über einen Datei-Upload-Dienst, der sowohl lokale Speicherung als auch Cloud-Speicher über Amazon S3 unterstützt. ?
Um den Upload-Dienst zu testen, können Sie Curl verwenden:
curl -X POST http://localhost:8080/upload -F "myFile=@path/to/your/file.jpg"
Oder, wenn Sie eine grafische Oberfläche bevorzugen, erstellen Sie ein schnelles HTML-Formular:
Laden Sie eine Datei hoch und Sie sollten sehen, dass sie lokal oder in Ihrem S3-Bucket gespeichert ist.
Der Aufbau eines Datei-Upload-Dienstes ist eine großartige Möglichkeit, Funktionalität hinzuzufügen und mehr über Dateiverarbeitung, Validierung und sogar Cloud-Speicher zu erfahren. Nachdem Sie sich nun mit den Grundlagen vertraut gemacht haben, überlegen Sie, was als nächstes kommt – sei es die Größenänderung von Bildern, die Videoverarbeitung oder die Verarbeitung größerer Dateitypen, es sind keine Grenzen gesetzt!
Haben Sie schon einmal einen Dienst zum Hochladen von Dateien erstellt? Hinterlassen Sie unten einen Kommentar mit Ihren Tipps oder teilen Sie mir mit, was Sie als Nächstes sehen möchten. Viel Spaß beim Codieren!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3