我正在使用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);
才能获得内容。我在这里缺少基本的东西吗?