Давайте поговорим о загрузке файлов. Независимо от того, создаете ли вы следующий Instagram, CMS или любое другое приложение, включающее пользовательский контент, вам придется работать с файлами. Сегодня мы погружаемся в мир загрузки файлов с помощью Go. Мы настроим простую службу загрузки файлов, которая сможет хранить файлы локально, и, для дополнительного интереса, мы даже подключим ее к Amazon S3, чтобы вы могли перейти в полноценный облачный режим. ?️
Вот план игры:
Берите кофе, и поехали! ☕
Перво-наперво — давайте настроим базовый 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Вот краткая информация:
Давайте создадим вспомогательную функцию 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 }
Безопасность превыше всего! Давайте добавим небольшую проверку, чтобы проходили только одобренные типы файлов.
Хотите сохранить это в безопасности? Давайте ограничим загрузку изображений. Вот как:
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) } }
Локальное хранилище — это хорошо, но если вы хотите масштабироваться, S3 — это то, что вам нужно! Давайте подключим ваш сервис загрузки файлов к Amazon S3, чтобы вы могли хранить файлы в облаке.
Для работы с 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:
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.
Создание службы загрузки файлов — отличный способ добавить функциональность и узнать об обработке, проверке и даже облачном хранении файлов. Теперь, когда вы освоили основы, подумайте, что будет дальше — будь то изменение размера изображения, обработка видео или обработка файлов большего размера, нет предела!
Вы уже создавали службу загрузки файлов? Оставьте комментарий ниже со своими советами или дайте мне знать, что вы хотели бы увидеть дальше. Приятного кодирования!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3