„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Erstellen eines Datei-Upload-Dienstes in Go

Erstellen eines Datei-Upload-Dienstes in Go

Veröffentlicht am 07.11.2024
Durchsuche:931

Building a File Upload Service in Go

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:

  1. Einrichten eines einfachen Datei-Upload-Endpunkts.
  2. Dateien verwalten, lokal speichern und sicherstellen, dass alles funktioniert.
  3. Einige grundlegende Validierung hinzufügen, um die Sicherheit zu gewährleisten.
  4. Und dann gehen wir mit S3-Speicher noch einen Schritt weiter.

Holen Sie sich Ihren Kaffee und los geht’s! ☕


Schritt 1: Erstellen des Datei-Upload-Endpunkts

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.

Server-Setup

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

Erstellen des Upload-Handlers

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(10 



Hier sind die Fakten:

  • Wir holen uns die Datei aus dem Formular mit r.FormFile("myFile").
  • Nachdem wir die Datei erhalten haben, öffnen (oder erstellen) wir eine lokale Datei und kopieren den Inhalt.
  • Dieses Setup eignet sich hervorragend für lokale Speicherung, schnelle Prototypen oder Projekte, die noch nicht für die Cloud-Speicherung bereit sind.

Lokales Speichern der Datei

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
}

Schritt 2: Validieren und Sichern Ihrer Dateien ?️

Sicherheit ist der Schlüssel! Fügen wir eine kleine Validierung hinzu, damit nur genehmigte Dateitypen durchkommen.

Validierung des MIME-Typs

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

Schritt 3: Mit S3 in die Cloud bringen ☁️

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.

Installieren Sie das AWS SDK

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

Konfigurieren Sie den S3-Client

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.

Ändern Sie den Upload-Handler

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. ?


Ausprobieren?

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.


Zusammenfassung

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!

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/neelp03/building-a-file-upload-service-in-go-34fj?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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