package main
import (
"context"
"fmt"
"io"
"log"
"mime/multipart"
"net/http"
"os"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/gridfs"
)
const (
uri = "mongodb://localhost:27017"
dbName = "fileStorageDB"
collection = "fs"
)
func UploadFiles(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(32 << 20)
if err != nil {
http.Error(w, "Failed to parse form data", http.StatusBadRequest)
return
}
client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(uri))
if err != nil {
log.Fatal(err)
}
db := client.Database(dbName)
bucket, err := gridfs.NewBucket(
db,
)
if err != nil {
log.Fatal(err)
}
for _, fileHeaders := range r.MultipartForm.File {
for _, fileHeader := range fileHeaders {
file, err := fileHeader.Open()
if err != nil {
log.Println("Failed to open file:", err)
continue
}
defer file.Close()
uploadStream, err := bucket.OpenUploadStream(fileHeader.Filename)
if err != nil {
log.Println("Failed to create upload stream:", err)
continue
}
defer uploadStream.Close()
_, err = io.Copy(uploadStream, file)
if err != nil {
log.Println("Failed to upload file:", err)
continue
}
log.Println("File uploaded:", fileHeader.Filename)
}
}
}
fmt.Fprintf(w, "Files uploaded successfully!")
}
func DownloadFile(w http.ResponseWriter, r *http.Request) {
filename := r.URL.Query().Get("filename")
client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(uri))
if err != nil {
log.Fatal(err)
}
db := client.Database(dbName)
bucket, err := gridfs.NewBucket(
db,
)
if err != nil {
log.Fatal(err)
}
downloadStream, err := bucket.OpenDownloadStreamByName(filename)
if err != nil {
log.Fatal(err)
}
defer downloadStream.Close()
w.Header().Set("Content-Type", "application/octet-stream")
_, err = io.Copy(w, downloadStream)
if err != nil {
log.Fatal(err)
}
}
func main() {
http.HandleFunc("/upload", UploadFiles)
http.HandleFunc("/download", DownloadFile)
log.Println("Server started on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}