«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Создание службы загрузки файлов на Go

Создание службы загрузки файлов на Go

Опубликовано 7 ноября 2024 г.
Просматривать:382

Building a File Upload Service in Go

Давайте поговорим о загрузке файлов. Независимо от того, создаете ли вы следующий Instagram, CMS или любое другое приложение, включающее пользовательский контент, вам придется работать с файлами. Сегодня мы погружаемся в мир загрузки файлов с помощью Go. Мы настроим простую службу загрузки файлов, которая сможет хранить файлы локально, и, для дополнительного интереса, мы даже подключим ее к Amazon S3, чтобы вы могли перейти в полноценный облачный режим. ?️

Вот план игры:

  1. Настройка простой конечной точки загрузки файлов.
  2. Обработка файлов, их локальное хранение и проверка работоспособности.
  3. Добавление базовой проверки для обеспечения безопасности.
  4. А затем мы поднимаемся на ступеньку выше с хранилищем S3.

Берите кофе, и поехали! ☕


Шаг 1. Создание конечной точки загрузки файлов

Перво-наперво — давайте настроим базовый HTTP-сервер с конечной точкой /upload. Для этого мы воспользуемся встроенным пакетом net/http Go, поскольку он прост и удобен в использовании.

Настройка сервера

Откройте свой любимый редактор, создайте файл main.go и настройте базовый сервер:

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

Создание обработчика загрузки

Теперь перейдем к самому интересному: обработке загрузки файлов! Мы создадим функцию fileUploadHandler, которая будет обрабатывать входящие файлы и сохранять их в локальном каталоге.

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 



Вот краткая информация:

  • Мы извлекаем файл из формы с помощью r.FormFile("myFile").
  • После получения файла мы открываем (или создаем) локальный файл и копируем его содержимое.
  • Эта настройка отлично подходит для локального хранилища, быстрых прототипов или проектов, которые еще не готовы к хранению в облаке.

Сохранение файла локально

Давайте создадим вспомогательную функцию createFile, которая будет определять, куда попадают наши файлы:

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
}

Шаг 2. Проверка и защита ваших файлов ?️

Безопасность превыше всего! Давайте добавим небольшую проверку, чтобы проходили только одобренные типы файлов.

Проверка типа MIME

Хотите сохранить это в безопасности? Давайте ограничим загрузку изображений. Вот как:

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

Шаг 3. Перенесите данные в облако с помощью S3 ☁️

Локальное хранилище — это хорошо, но если вы хотите масштабироваться, S3 — это то, что вам нужно! Давайте подключим ваш сервис загрузки файлов к Amazon S3, чтобы вы могли хранить файлы в облаке.

Установите AWS SDK

Для работы с S3 вам понадобится AWS SDK:

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

Настройте клиент S3

Давайте настроим функцию для подключения к вашей корзине 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
}

Замените «имя-вашего-корзины» на фактическое имя корзины S3. Теперь давайте настроим наш обработчик загрузки для использования этой функции.

Измените обработчик загрузки

Обновите fileUploadHandler, чтобы мы сохраняли файл в S3, а не локально:

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

И всё! Теперь у вас есть сервис загрузки файлов, который поддерживает как локальное, так и облачное хранилище через Amazon S3. ?


Тестирование?

Чтобы протестировать службу загрузки, вы можете использовать Curl:

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

Или, если вы предпочитаете графический интерфейс, создайте быструю HTML-форму:

Загрузите файл, и вы увидите, что он сохранен локально или в корзине S3.


Подведение итогов

Создание службы загрузки файлов — отличный способ добавить функциональность и узнать об обработке, проверке и даже облачном хранении файлов. Теперь, когда вы освоили основы, подумайте, что будет дальше — будь то изменение размера изображения, обработка видео или обработка файлов большего размера, нет предела!

Вы уже создавали службу загрузки файлов? Оставьте комментарий ниже со своими советами или дайте мне знать, что вы хотели бы увидеть дальше. Приятного кодирования!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/neelp03/building-a-file-upload-service-in-go-34fj?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3