دعونا نتحدث عن تحميل الملفات. سواء كنت تقوم بإنشاء 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 }
استبدل "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 الخاصة بك.
يعد إنشاء خدمة تحميل الملفات طريقة رائعة لإضافة الوظائف والتعرف على كيفية معالجة الملفات والتحقق من صحتها وحتى التخزين السحابي. الآن بعد أن انتهيت من الأساسيات، فكر في الخطوة التالية — سواء كان ذلك تغيير حجم الصورة، أو معالجة الفيديو، أو التعامل مع أنواع ملفات أكبر، فلا حدود لها!
هل قمت بإنشاء خدمة تحميل ملفات من قبل؟ قم بإسقاط تعليق أدناه يتضمن نصائحك، أو أخبرني بما تريد رؤيته بعد ذلك. ترميز سعيد!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3