Хранение и возврат файлов из MongoDB - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над 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);, чтобы получить контент. М я здесь что-то упустил?

...