从MongoDB存储和取回文件

时间:2018-07-04 11:19:30

标签: c# mongodb gridfs

我正在使用c#.Net 4.5

我必须在MongoDB上上传一些文件,而在其他模块中,我必须根据元数据取回它们。

为此,我正在执行以下操作

    static void uploadFileToMongoDB(GridFSBucket gridFsBucket)
    {
        if (Directory.Exists(_sourceFilePath))
        {
            if (!Directory.Exists(_uploadedFilePath))
                Directory.CreateDirectory(_uploadedFilePath);

            FileInfo[] sourceFileInfo = new DirectoryInfo(_sourceFilePath).GetFiles();

            foreach (FileInfo fileInfo in sourceFileInfo)
            {
                string filePath = fileInfo.FullName;
                string remoteFileName = fileInfo.Name;
                string extension = Path.GetExtension(filePath);

                double fileCreationDate = fileInfo.CreationTime.ToOADate();
                GridFSUploadOptions gridUploadOption = new GridFSUploadOptions
                    {
                        Metadata = new BsonDocument
                                    {{ "creationDate", fileCreationDate },
                                    { "extension", extension }}
                    };

                using (Stream fileStream = File.OpenRead(filePath))
                    gridFsBucket.UploadFromStream(remoteFileName, fileStream, gridUploadOption);
            }
        }
    }

并下载

    static void getFileInfoFromMongoDB(GridFSBucket bucket, DateTime startDate, DateTime endDate)
    {
        double startDateDoube = startDate.ToOADate();
        double endDateDouble = endDate.ToOADate();

        var filter = Builders<GridFSFileInfo>.Filter.And(
            Builders<GridFSFileInfo>.Filter.Gt(x => x.Metadata["creationDate"], startDateDoube),
            Builders<GridFSFileInfo>.Filter.Lt(x => x.Metadata["creationDate"], endDateDouble));

        IAsyncCursor<GridFSFileInfo> fileInfoList = bucket.Find(filter); //****

        if (!Directory.Exists(_destFilePath))
            Directory.CreateDirectory(_destFilePath);

        foreach (GridFSFileInfo fileInfo in fileInfoList.ToList())
        {
            string destFile = _destFilePath + "\\" + fileInfo.Filename;
            var fileContent = bucket.DownloadAsBytes(fileInfo.Id); //****
            File.WriteAllBytes(destFile, fileContent);
        }
    }

在此代码中(有效),但是我有两个问题,我不确定该如何解决。

  • 如果我已上传文件,然后再次上传,则实际上 已上传。如何预防呢?

当然两个上传的文件都具有不同的ObjectId,但是在上传文件时,我将不知道哪些文件已经上传。所以我想要一种机制,如果我上传已经上传的文件会引发异常。可能吗? (我可以结合使用文件名,创建日期等)

  • 如果您在代码中注意到,实际上我是两次请求数据库服务器以将一个文件写入磁盘,该如何一次完成?

请注意用“ // ****”注释标记的代码行。首先,我要查询数据库以获取fileInfo(GridFSFileInfo)。我期望只能从此对象获取文件的实际内容。但是我没有在该对象中找到任何相关的属性或方法。所以我必须做var fileContent = bucket.DownloadAsBytes(fileInfo.Id);才能获得内容。我在这里缺少基本的东西吗?

0 个答案:

没有答案