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  }