通过Web API将大文件(> 1 GB)上传到Azure Blob存储 1。将整个文件读取为字节,然后在代码中将文件分成较小的部分。 2。使用Put Block API上传每件作品。 3。用Put Block List API组成Blob。

我们有一个托管在.zure应用程序服务中的应用程序(.Net核心),我们正在尝试使用UI中的表单数据通过Web API将大文件上传到Azure blob。我们已经更改了请求长度和API请求超时,即使上传200MB文件,我们仍然面临着连接超时错误

下面是我正在使用的示例代码

[HttpPost]
[Route("upload")]
[Consumes("multipart/form-data")]
[RequestFormLimits(MultipartBodyLengthLimit = 2147483648)]
public async Task<IHttpactionResult> Upload([FromForm] FileRequestObject fileRequestObject)
{
    var url = "upload_url_to_blob_storage";
    var file = fileRequestObject.Files[0];

    var blob = new CloudBlockBlob(new Uri(url));
    blob.Properties.ContentType = file.ContentType;

    await blob.UploadFromStreamAsync(file.InputStream);

    //some other operations based on file upload
    return Ok();
}


public class FileRequestObject
{
    public List<IFormFile> Files { get; set; }
    public string JSON { get; set; }
    public string BlobUrls { get; set; }

}
superhsq 回答:通过Web API将大文件(> 1 GB)上传到Azure Blob存储 1。将整个文件读取为字节,然后在代码中将文件分成较小的部分。 2。使用Put Block API上传每件作品。 3。用Put Block List API组成Blob。

根据您的代码,您希望将大文件作为blockblob上载到Azure blob存储。请注意,它有一个限制。有关更多详细信息,请参阅document

  

通过“放置Blob”创建的块Blob的最大大小为256 MB   版本2016-05-31及更高版本,旧版本为64 MB。如果你的   对于2016-05-31及更高版本,blob大于256 MB,或64 MB   对于较旧的版本,您必须将其作为一组块上传

因此,如果您想将大文件蔚蓝阻塞块,请使用以下步骤:

1。将整个文件读取为字节,然后在代码中将文件分成较小的部分。

  • 每块可能8 MB。

2。使用Put Block API上传每件作品。

  • 在每个请求中,它包含一个blockid。

3。用Put Block List API组成Blob。

  • 在此请求中,您需要按顺序将所有blockid放入正文中。

例如:

[HttpPost]
        [Consumes("multipart/form-data")]
        [RequestFormLimits(MultipartBodyLengthLimit = 2147483648)]
        public async Task<ActionResult> PostAsync([FromForm]FileRequestObject fileRequestObject)
        {



            string storageAccountConnectionString = "DefaultEndpointsProtocol=https;AccountName=blobstorage0516;AccountKey=UVOOBCxQpr5BVueU+scUeVG/61CZbZmj9ymouAR9609WbqJhhma2N+WL/hvaoNs4p4DJobmT0F0KAs0hdtPcqA==;EndpointSuffix=core.windows.net";
            CloudStorageAccount StorageAccount = CloudStorageAccount.Parse(storageAccountConnectionString);
            CloudBlobClient BlobClient = StorageAccount.CreateCloudBlobClient();
            CloudBlobContainer Container = BlobClient.GetContainerReference("test");
            await Container.CreateIfNotExistsAsync();
            CloudBlockBlob blob = Container.GetBlockBlobReference(fileRequestObject.File.FileName);
            HashSet<string> blocklist = new HashSet<string>();
            var file = fileRequestObject.File;
            const int pageSizeInBytes = 10485760;
            long prevLastByte = 0;
            long bytesRemain = file.Length;

            byte[] bytes;

            using (MemoryStream ms = new MemoryStream())
            {
                var fileStream = file.OpenReadStream();
                await fileStream.CopyToAsync(ms);
                bytes = ms.ToArray();
            }

            // Upload each piece
                do
                {
                    long bytesToCopy = Math.Min(bytesRemain,pageSizeInBytes);
                    byte[] bytesToSend = new byte[bytesToCopy];

                    Array.Copy(bytes,prevLastByte,bytesToSend,bytesToCopy);
                    prevLastByte += bytesToCopy;
                    bytesRemain -= bytesToCopy;

                    //create blockId
                    string blockId = Guid.NewGuid().ToString();
                    string base64BlockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId));

                    await blob.PutBlockAsync(
                        base64BlockId,new MemoryStream(bytesToSend,true),null
                        );

                    blocklist.Add(base64BlockId);

                } while (bytesRemain > 0);

            //post blocklist
            await blob.PutBlockListAsync(blocklist);



            return Ok();
            // For more information on protecting this API from Cross Site Request Forgery (CSRF) attacks,see https://go.microsoft.com/fwlink/?LinkID=717803
        }

public class FileRequestObject
    {
        public IFormFile File { get; set; }
    }

enter image description here enter image description here 有关更多详细信息,请参阅https://www.red-gate.com/simple-talk/cloud/platform-as-a-service/azure-blob-storage-part-4-uploading-large-blobs/

本文链接:https://www.f2er.com/3154325.html

大家都在问