2

所有,我试图在一个网页中上传一个更大的文件(700MB),其中包含一个 Form 中的 File html 元素。我想在服务器端可以获取流并将其上传到 Azure 存储。这是服务器端的一些代码片段。

public void UploadFile()
{
    Stream source = Request.InputStream; 
    
    long copiedByteCount = 0;

    byte[] buffer = new byte[2 * 1024];
    
    for (int len; (len = from.Read(buffer, 0, buffer.Length)) > 0; )
    {
        //Begin to write buffer to Azure.
        ....(I am still searching the BlockBlob code sample in google.)
        //
        copiedByteCount += len;
    }
   
}

我的问题是

1.我希望app不要吃掉所有的内存,所以逐块读取流。我不知道它是否如我所愿。

2.有人可以帮忙举个例子如何将所有缓冲区块并行写入BlockBlob。

谢谢。

4

1 回答 1

2

首先你必须知道,要允许上传 700MB,你需要在 web.config 中允许:

<system.web>
  <httpRuntime executionTimeout="240" maxRequestLength="716800" />
</system.web>

<system.webServer> 
    <security> 
        <requestFiltering>
            <requestLimits maxAllowedContentLength="716800" /> 
        </requestFiltering> 
    </security> 
</system.webServer>

每当有人上传大于 256KB 的文件(这是默认设置)时,该文件都会缓冲到磁盘(在此处记录)。所以你不必担心传入的文件。

要将此文件上传到 blob 而不将其加载到内存中,您可以简单地使用 HttpPostedFile 的流并将其转发到存储客户端:

 var blob = container.GetBlockBlobReference(blobName);
 blob.UploadFromStream(Request.Files[0].InputStream);

最后,如果您想并行上传 Blob,您可以从此页面上的代码开始:Blob 并行上传和下载(您需要更改UploadFileToBlobAsync方法以接受流而不是文件名)。

于 2012-09-23T09:27:51.410 回答