使用WebClient传输非常大的文件

时间:2014-05-27 10:57:14

标签: c# silverlight webclient

我的要求是转移大小为400MB或更多的zip文件;以下代码适用于至少40MB;但是,我需要将byte[] bytes = new byte[50000000];更改为byte[] bytes = new byte[400000000];,将maxRequestLength更改为maxRequestLength="409600";

问题是byte[] bytes = new byte[100000000];返回有关空间不足的错误。那么如何使用WebClient传输大文件?

WebClient client = new WebClient();
client.AllowWriteStreamBuffering = true;
UriBuilder ub = new UriBuilder("http://localhost:57596/UploadImages.ashx");
ub.Query = "ImageName=" + "DataSet" + DataSetId + ".zip";
client.OpenWriteCompleted += (InputStream, eArguments) =>
{

    try
    {
        using (Stream output = eArguments.Result)
        {

            output.Write(ImagesAux, 0, (int)ImagesAux.Length);
            //numeroimagem++;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        //throw;
    }

};
client.OpenWriteAsync(ub.Uri);
在UploadImages.ashx

public void ProcessRequest(HttpContext context)
{
    //context.Response.ContentType = "text/plain";
    //context.Response.Write("Hello World");

    string ImageName = context.Request.QueryString["ImageName"];
    string UploadPath = context.Server.MapPath("~/ServerImages/");

    using (FileStream stream = File.Create(UploadPath + ImageName))
    {

        byte[] bytes = new byte[50000000]; // 
        int bytesToRead = 0;

        while ((bytesToRead =
        context.Request.InputStream.Read(bytes, 0, bytes.Length)) != 0)
        {

            stream.Write(bytes, 0, bytesToRead);
            stream.Close();

        }

    }

}
<。>在Web.config中

<httpRuntime targetFramework="4.5" maxRequestLength="40960"/>

1 个答案:

答案 0 :(得分:0)

您永远不应该将所有内容加载到内存中然后将所有内容写回磁盘,而是应该在读取它们时加载碎片并将它们写入磁盘。 当您完成阅读后,关闭您正在写入的流。 否则,只要达到GB的大小,就可以非常快速地获得OutOfMemory。

所以我会把写字节改为磁盘:

using (FileStream stream = File.Create(UploadPath + ImageName))
{
    byte[] bytes = new byte[50000000]; // 
    int bytesToRead = 0;
    while ((bytesToRead = context.Request.InputStream.Read(bytes, 0, bytes.Length)) != 0)
    {
        stream.Write(bytes, 0, bytesToRead);
        stream.Close();
    }
}

到此:

using (FileStream stream = File.Create(UploadPath + ImageName))
{
    byte[] bytes = new byte[1024];
    long totalBytes = context.Request.InputStream.Length;
    long bytesRead = 0;
    int bytesToRead = bytes.Length;

    if (totalBytes - bytesRead < bytes.Length)
        bytesToRead = (int)(totalBytes - bytesRead);
    bytes = new byte[bytesToRead];

    while ((bytesToRead = context.Request.InputStream.Read(bytes, bytesRead, bytes.Length)) != 0)
    {
        stream.Write(bytes, bytesRead, bytes.Length);

        bytesRead += bytes.Length;
        if (totalBytes - bytesRead < bytes.Length)
            bytesToRead = (int)(totalBytes - bytesRead);
        bytes = new byte[bytesToRead];

    }
    stream.Close();
}

1024将是缓冲区大小。