- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Windows Azure 存储客户端库,CloudBlob.OpenRead() 方法仅读取 4 mb 的数据。如何使用 OpenRead 方法读取完整流。
CloudBlob blob = container.GetBlobReference(filename);
Stream stream = blob.OpenRead();
我必须使用OpenRead方法。无法使用 DownloadToFile 或 DownloadToStream。
编辑:超出我范围的消费者代码调用
stream.CopyTo(readIntoStream);
CopyTo 是一种扩展方法。
public static int CopyTo(this Stream source, Stream destination)
{
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
int bytesCopied = 0;
do
{
bytesRead = source.Read(buffer, 0, BUFFER_SIZE);
if (bytesRead > 0)
destination.Write(buffer, 0, bytesRead);
bytesCopied += bytesRead;
}
while (bytesRead > 0);
return bytesCopied;
}
编辑2:
我观察到,当使用 blob.UploadText() 方法上传文件时,它工作正常,但是当使用 OpenWrite 方法上传 blob 时(如以下代码示例所示),OpenRead 方法仅读取 4194304 字节 (4 mb)。
using(var input = File.OpenRead(@"C:\testFile.txt")) //5000000 bytes
using (var output = blob.OpenWrite())
{
input.CopyTo(output);
}
编辑3:
在我这里产生问题的完整代码。
static void Main(string[] args)
{
var blobContainer = GetContainer("tier1");
blobContainer.CreateIfNotExist();
var containerPermissions = new BlobContainerPermissions();
containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob;
blobContainer.SetPermissions(containerPermissions);
var blob = blobContainer.GetBlobReference("testfileWithOpenWrite1.txt");
using (var input = File.OpenRead(@"C:\testFile.txt")) //5000000 bytes
using (var output = blob.OpenWrite(new BlobRequestOptions()))
input.CopyTo(output);
Console.WriteLine("uploaded");
int bytesDownloaded = 0;
byte[] buffer = new byte[65536];
using (BlobStream bs = blob.OpenRead())
{
int chunkLength;
do
{
chunkLength = bs.Read(buffer, 0, buffer.Length);
bytesDownloaded += chunkLength;
} while (chunkLength > 0);
}
Console.WriteLine(bytesDownloaded);
}
public static int CopyTo(this Stream source, Stream destination)
{
int BUFFER_SIZE = 65536;
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
int bytesCopied = 0;
do
{
bytesRead = source.Read(buffer, 0, BUFFER_SIZE);
if (bytesRead > 0)
destination.Write(buffer, 0, bytesRead);
bytesCopied += bytesRead;
}
while (bytesRead > 0);
return bytesCopied;
}
编辑 4 - 结论:
这可能是 SDK v1.2 附带的 Microsoft.WindowsAzure.StorageClient.dll(程序集版本 6.0.6002.17043)中的错误。它适用于最新的 Microsoft.WindowsAzure.StorageClient.dll(程序集版本 6.0.6002.18312 - SDK v1.4)。
谢谢smarx:)
最佳答案
我无法重现您所看到的内容。事情似乎按预期进行:
static void Main(string[] args)
{
// I also tried a real cloud storage account. Same result.
var container = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudBlobClient().GetContainerReference("testcontainer");
container.CreateIfNotExist();
var blob = container.GetBlobReference("testblob.txt");
blob.UploadText(new String('x', 5000000));
var source = blob.OpenRead();
int BUFFER_SIZE = 4000000;
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
int bytesCopied = 0;
do
{
bytesRead = source.Read(buffer, 0, BUFFER_SIZE);
bytesCopied += bytesRead;
} while (bytesRead > 0);
Console.WriteLine(bytesCopied); // prints 5000000
}
编辑:
我现在也(为了回答已编辑的问题)尝试使用 OpenWrite 上传 blob,结果是相同的。 (我得到了完整的 blob。)我使用此代码代替 blob.UploadText(...):
using (var input = File.OpenRead(@"testblob.txt")) //5000000 bytes
using (var output = blob.OpenWrite())
{
input.CopyTo(output);
}
最终的 WriteLine 仍然打印 5000000。
编辑2:
这有点令人厌烦。将 BUFFER_SIZE 更改为 65536 没有改变任何内容。结果对我来说仍然是正确的。这是我的完整应用程序以进行比较:
static void Main(string[] args)
{
// I also tried a real cloud storage account. Same result.
var container = CloudStorageAccount.DevelopmentStorageAccount.CreateCloudBlobClient().GetContainerReference("testcontainer");
container.CreateIfNotExist();
var blob = container.GetBlobReference("testblob.txt");
using (var input = File.OpenRead(@"testblob.txt")) //5000000 bytes
using (var output = blob.OpenWrite())
{
input.CopyTo(output);
}
var source = blob.OpenRead();
int BUFFER_SIZE = 65536;
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
int bytesCopied = 0;
do
{
bytesRead = source.Read(buffer, 0, BUFFER_SIZE);
bytesCopied += bytesRead;
} while (bytesRead > 0);
Console.WriteLine(bytesCopied); // prints 5000000
}
关于c# - CloudBlob.OpenRead() 未读取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911728/
这个问题已经有答案了: Differences between Azure Block Blob and Page Blob? (6 个回答) 已关闭 1 年前。 看起来像CloudBlob有 3 个
我使用 SQL Azure 来存储 Blob 元数据,并使用 Azure Blob 存储来存储实际的 Blob。 Blob 创建/删除是通过在环境 TransactionScope 中登记这些操作来实
任务 使用原始文件名将文件上传到 Azure Blob Storage,并将文件名作为 meta-data 分配给 CloudBlob 问题 元数据中不允许使用这些字符,但可以接受作为blob名称:
以下单元测试失败: [TestMethod] public void Add_file_to_blob_and_retrieve_it() { var blobName = Guid.NewG
使用 Windows Azure 存储客户端库,CloudBlob.OpenRead() 方法仅读取 4 mb 的数据。如何使用 OpenRead 方法读取完整流。 CloudBlob blob =
使用 Windows Azure 存储客户端库,CloudBlob.OpenRead() 方法仅读取 4 mb 的数据。如何使用 OpenRead 方法读取完整流。 CloudBlob blob =
我想将用户上传到我的网站的文件保存到我的 Azure Blob 中,并且我正在使用 CloudBlob.UploadFromStream 方法来执行此操作,但我想确保在做更多工作之前文件已顺利完成保存
我正在尝试从我的 Azure 存储帐户下载二进制文件。最初,我使用 CloudBlob.DownloadToFileAsync(),它允许我提供 IProgress 参数并获取传输进度更新。 但是,在
我一定在这里遗漏了一些明显的东西,但我发现自己无法进行我认为合法的向上转换。我正在尝试将数据上传到 Azure 中的 Blob 存储,并且想使用方法 CloudBlob.UploadText(stri
我正在尝试通过流从 cloudBlob 下载文件。我引用这篇文章CloudBlob 这是下载 blob 的代码 public Stream DownloadBlobAsStream(CloudStor
编辑:扩展代码示例以显示如何加载 destinationBlob。 我们正在利用直接帐户到帐户复制来传输一组 blob。由于属性在进程启动时会被覆盖,因此我们会定期监视目标 blob,然后在复制完成时
编辑:扩展代码示例以显示如何加载 destinationBlob。 我们正在利用直接帐户到帐户复制来传输一组 blob。由于属性在进程启动时会被覆盖,因此我们会定期监视目标 blob,然后在复制完成时
几个小时以来,我一直在尝试在使用 Azure SDK 创建的 blob 上设置一些元数据。我使用 BeginUploadFromStream() 异步上传数据,一切顺利。上传完成后,我可以使用 Blo
我正在尝试获取有关 Azure blob(上次修改的 UTC 日期时间)的一些信息。此信息存储在 CloudBlob.Properties.LastModifiedUtc 属性中。 如果我使用方法 G
我有以下代码,该代码使用已弃用的 Microsoft.WindowsAzure.StorageClient 并已升级到 Microsoft.WindowsAzure.Storage,现在我无法使用下面
我很确定这是 Windows Azure SDK 的限制(使用最新的 1.4),但必须有一种方法可以解决这个问题,而无需使用手动 REST... 代码: CloudBlob blob = contai
所以我一直在浏览https://learn.microsoft.com/en-us/learn/modules/copy-blobs-from-command-line-and-code/7-move
我想创建端点来传输存储在 azure CloudBlob 中的视频流。这是我的代码片段: public async Task GetVideo(string videoId) {
我似乎收到了 403: HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authoriza
我似乎收到了 403: HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authoriza
我是一名优秀的程序员,十分优秀!