1

我想知道如何形成 Blobrequest.PutBlock(Uri uri,int timeout,string blockid,string leaseid);

当用户尝试上传像 100 MB 这样的大文件时,我会将它们分成内存中每个 4MB 的块(将 4 MB 数据读入字节 [])..

如何将传入的文件流拆分为块并使用 BlobRequest.PutBlock 和 BlobRequest.PutBlockList 上传到 blob,因为我有与 blob 关联的租约。如果我需要拆分文件并使用可用的 Azure 上传带有租约 id 的块,这是唯一的选择开发工具包 1.7.0

问候, 维维克

4

2 回答 2

1

只需在调用PutBlock时将 leaseId 作为最后一个参数传递:

public static HttpWebRequest PutBlock (
    Uri uri,
    int timeout,
    string blockId,
    string leaseId
)

如果您有 CloudBlob,则该 URL 很容易构建(有关更多信息,请参阅 Steve 的博客文章):

var creds = blob.ServiceClient.Credentials;
var transformedUri = new Uri(creds.TransformUri(blob.Uri.ToString()));
BlobRequest.PutBlock(transformedUri, ...)
于 2012-10-10T12:04:07.773 回答
0

您可以发现此链接对于研究将文件上传到块中的 azure blob 很有用:
http ://wely-lau.net/2012/02/26/uploading-big-files-in-windows-azure-blob-storage-with- putlistblock/
我在这里复制代码以删除外部依赖项:

 protected void btnUpload_Click(object sender, EventArgs e)
{
    CloudBlobClient blobClient;
    var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    blobClient = storageAccount.CreateCloudBlobClient();

    CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");
    container.CreateIfNotExist();

    var permission = container.GetPermissions();
    permission.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permission);

    string name = fu.FileName;
    CloudBlockBlob blob = container.GetBlockBlobReference(name);

    blob.UploadFromStream(fu.FileContent);

    int maxSize = 1 * 1024 * 1024; // 4 MB

    if (fu.PostedFile.ContentLength > maxSize)
    {
        byte[] data = fu.FileBytes; 
        int id = 0;
        int byteslength = data.Length;
        int bytesread = 0;
        int index = 0;
        List<string> blocklist = new List<string>();
        int numBytesPerChunk = 250 * 1024; //250KB per block

        do
        {
            byte[] buffer = new byte[numBytesPerChunk];
            int limit = index + numBytesPerChunk;
            for (int loops = 0; index < limit; index++)
            {
                buffer[loops] = data[index];
                loops++;
            }
            bytesread = index;
            string blockIdBase64 = Convert.ToBase64String(System.BitConverter.GetBytes(id));

            using (var ms = new MemoryStream(buffer, true))
              blob.PutBlock(blockIdBase64, ms, null);

无效的); blocklist.Add(blockIdBase64); 身份证++; } while (byteslength - bytesread > numBytesPerChunk);

        int final = byteslength - bytesread;
        byte[] finalbuffer = new byte[final];
        for (int loops = 0; index < byteslength; index++)
        {
            finalbuffer[loops] = data[index];
            loops++;
        }
        string blockId = Convert.ToBase64String(System.BitConverter.GetBytes(id));
        using (var ms = new MemoryStream(finalbuffer, true))
          blob.PutBlock(blockId, ms, null);
        blocklist.Add(blockId);

        blob.PutBlockList(blocklist); 
    }
    else
        blob.UploadFromStream(fu.FileContent);            
}

您还可以在此处找到由 Steve Marx 开发的用于大文件上传(例如)的 silverlight 控件

于 2012-10-10T12:23:16.897 回答