github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/30_mongo/gridfs/main.go (about) 1 package main 2 3 /* 4 mongo 保存大于16M的文件 5 */ 6 import ( 7 "bytes" 8 "context" 9 "fmt" 10 "io/ioutil" 11 "log" 12 "os" 13 "path" 14 "time" 15 16 "go.mongodb.org/mongo-driver/bson" 17 "go.mongodb.org/mongo-driver/mongo" 18 "go.mongodb.org/mongo-driver/mongo/gridfs" 19 "go.mongodb.org/mongo-driver/mongo/options" 20 ) 21 22 func InitiateMongoClient() *mongo.Client { 23 var err error 24 var client *mongo.Client 25 uri := fmt.Sprintf("mongodb://%s:%s@%s", 26 "admin", 27 "123456", 28 "localhost:27017", 29 ) 30 opts := options.Client() 31 opts.ApplyURI(uri) 32 opts.SetMaxPoolSize(5) 33 if client, err = mongo.Connect(context.Background(), opts); err != nil { 34 fmt.Println(err.Error()) 35 } 36 return client 37 } 38 func UploadFile(file, filename string) { 39 40 data, err := ioutil.ReadFile(file) 41 if err != nil { 42 log.Fatal(err) 43 } 44 conn := InitiateMongoClient() 45 bucket, err := gridfs.NewBucket( 46 conn.Database("myfiles"), 47 ) 48 if err != nil { 49 log.Fatal(err) 50 os.Exit(1) 51 } 52 uploadStream, err := bucket.OpenUploadStream( 53 filename, 54 ) 55 if err != nil { 56 fmt.Println(err) 57 os.Exit(1) 58 } 59 defer uploadStream.Close() 60 61 fileSize, err := uploadStream.Write(data) 62 if err != nil { 63 log.Fatal(err) 64 os.Exit(1) 65 } 66 log.Printf("Write file to DB was successful. File size: %d M\n", fileSize) 67 } 68 func DownloadFile(fileName string) { 69 conn := InitiateMongoClient() 70 71 // For CRUD operations, here is an example 72 db := conn.Database("myfiles") 73 fsFiles := db.Collection("fs.files") 74 ctx, _ := context.WithTimeout(context.Background(), 10*time.Second) 75 var results bson.M 76 err := fsFiles.FindOne(ctx, bson.M{}).Decode(&results) 77 if err != nil { 78 log.Fatal(err) 79 } 80 // you can print out the results 81 fmt.Println(results) 82 83 bucket, _ := gridfs.NewBucket( 84 db, 85 ) 86 var buf bytes.Buffer 87 dStream, err := bucket.DownloadToStreamByName(fileName, &buf) 88 if err != nil { 89 log.Fatal(err) 90 } 91 log.Printf("File size to download: %v\n", dStream) 92 fmt.Printf("%v\n", string(buf.Bytes())) 93 //ioutil.WriteFile(fileName, buf.Bytes(), 0600) 94 95 } 96 97 func main() { 98 // Get os.Args values 99 file := "file.txt" //os.Args[1] //os.Args[1] = testfile.zip 100 filename := path.Base(file) 101 UploadFile(file, filename) 102 // Uncomment the below line and comment the UploadFile above this line to download the file 103 DownloadFile(filename) 104 }