"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > إنشاء خدمة تحميل الملفات في Go

إنشاء خدمة تحميل الملفات في Go

تم النشر بتاريخ 2024-11-07
تصفح:515

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
}

استبدل "your-bucket-name" باسم حاوية 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 -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