【发布时间】:2019-08-22 14:22:20
【问题描述】:
我在从 MongoDB 2 Azure blob 存储迁移文件时遇到问题。
next 方法获取一个 GridFSFile 对象(表示 MongoDB GridFSFileStorage 中的一个文件),然后调用 uploadMemoryStream 方法进行上传。
值得一提的是gridFSFile在findById之后确实有内容,而length dows也有内容,并且那个位置最初是0。
gridFSFile.Open 方法创建一个 Stream 对象,然后我将其作为参数传递给上传。
private static void iterateOverVersionCollection(Version version, Asset asset)
{
try
{
string _gridFSId = version.GridFSId;
GridFSFile gridFSFile = gridFSFileStorage.FindById(_gridFSId);
if (gridFSFile == null) return;
string size = version.Name.ToLower();
asset.Size = size;
CloudBlockBlob blockBlob = GetBlockBlobReference(version, gridFSFile, asset);
uploadMemoryStream(blockBlob, gridFSFile, asset);
asset.UploadedOK = true;
}
catch (StorageException ex)
{
asset.UploadedOK = false;
logException(ex, asset);
}
}
private static void uploadMemoryStream(CloudBlockBlob blockBlob, GridFSFile gridFSFile, Asset asset)
{
Stream st = gridFSFile.Open();
blockBlob.UploadFromStream(st);
}
UploadFromStream 永远不会上传,而且要提一提的是,无论我如何使用 gridFSFile,如果我尝试使用 Stream.copyTo c# 方法用它创建一个 MemoryStream,它也永远不会结束所以应用程序卡在 blockBlob.UploadFromStream(st);
除了将 gridFSFile.Open 传递给 UploadFromMemoryStream,我还尝试了下一段代码:
using (var stream = new MemoryStream())
{
byte[] buffer = new byte[2048]; // read in chunks of 2KB
int bytesRead;
while((bytesRead = st.Read(buffer, 0, buffer.Length)) > 0)
{
stream.Write(buffer, 0, bytesRead);
}
byte[] result = stream.ToArray();
}
但同样,程序卡在 st.Read 行。
任何帮助将不胜感激。
【问题讨论】:
标签: c# mongodb azure azure-blob-storage