上传大文件(1GB)-ASP.net

时间:2009-10-21 08:15:22

标签: c# .net

我需要上传至少1GB文件大小的大文件。 我使用ASP.NetC#IIS 5.1作为我的开发平台。

我正在使用:

HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength)

使用前:

File.WriteAllBytes(filePath, fileByteArray)

(不会去这里,但会给System.OutOfMemoryException例外)

目前我已将httpRuntime设置为:

  

executionTimeout =“ 999999 ”maxRequestLength =“ 2097151 ”(即2GB!)       useFullyQualifiedRedirectUrl =“true”minFreeThreads =“8”minLocalRequestFreeThreads =“4”       appRequestQueueLimit =“5000”enableVersionHeader =“true”requestLengthDiskThreshold =“8192”

我也设置了maxAllowedContentLength="**2097151**"(猜测它只适用于IIS7)

我已将IIS连接超时更改为999,999秒。

我无法上传偶数4578KB的文件(Ajaz-Uploader.zip)

8 个答案:

答案 0 :(得分:6)

我们有一个偶尔需要上传1和2 GB文件的应用程序,所以也一直在运行。经过大量研究,我的结论是我们需要实现前面提到的NeatUpload或类似的东西。

另外,请注意

<requestLimits maxAllowedContentLength=.../>

字节衡量,而

<httpRuntime maxRequestLength=.../>

千字节衡量。所以你的价值看起来应该更像这样:

<httpRuntime maxRequestLength="2097151"/>
...
<requestLimits maxAllowedContentLength="2097151000"/>

答案 1 :(得分:3)

我用Google搜索并找到了 - NeatUpload


另一个解决方案是读取客户端上的字节并将其发送到服务器,服务器保存文件。 实施例

服务器:在命名空间 - 上传器,类 - 上传

[WebMethod]
public bool Write(String fileName, Byte[] data)
{
    FileStream  fs = File.Open(fileName, FileMode.Open);
    BinaryWriter bw = new BinaryWriter(fs); 
    bw.Write(data);
    bw.Close();

    return true;
}

客户端:

string filename = "C:\..\file.abc";
Uploader.Upload up = new Uploader.Upload();
FileStream  fs = File.Create(fileName); 
BinaryReader br = new BinaryReader(fs);

// Read all the bytes
Byte[] data = br.ReadBytes();
up.Write(filename,data);

答案 2 :(得分:1)

我知道这是一个老问题,但仍然没有答案。

所以这就是你要做的事情:

在您的web.config文件中,将其添加到:

    <!-- 3GB Files / in kilobyte (3072*1024) -->
    <httpRuntime targetFramework="4.5" maxRequestLength="3145728"/>

,在

<security>
    <requestFiltering>

      <!-- 3GB Files / in byte (3072*1024*1024) -->
      <requestLimits maxAllowedContentLength="3221225472" />

    </requestFiltering>
</security>

你在评论中看到它是如何工作的。在一个中你需要以字节为单位,而另一个以千字节为单位。希望有所帮助。

答案 3 :(得分:0)

尝试复制而不加载内存中的所有内容:

public void CopyFile()
{
    Stream source = HIF.PostedFile.InputStream; //your source file
    Stream destination = File.OpenWrite(filePath); //your destination
    Copy(source, destination);
}

public static long Copy(Stream from, Stream to)
{
    long copiedByteCount = 0;

    byte[] buffer = new byte[2 << 16];
    for (int len; (len = from.Read(buffer, 0, buffer.Length)) > 0; )
    {
        to.Write(buffer, 0, len);
        copiedByteCount += len;
    }
    to.Flush();

    return copiedByteCount;
}

答案 4 :(得分:0)

检查this blog entry有关大型文件上传的信息。它还与一些讨论论坛有一些链接,可以对此有所了解。建议使用自定义HttpHandler进行自定义Flash / Silverlight控件。

答案 5 :(得分:0)

对于IIS 6.0,您可以在Metabase.xml中更改AspMaxEntityAllowed,但我不认为它在IIS 5.1中是直接的。

此链接可能有所帮助,希望如此:

http://itonlinesolutions.com/phpbb3/viewtopic.php?f=3&t=63

答案 6 :(得分:0)

设置maxRequestLength应足以上传大于4mb的文件,这是HTTP请求大小的默认限制。请确保没有任何内容覆盖您的配置文件。

或者,您可以检查async upload provided by Telerik,它以2mb块的形式上传文件,并且可以有效地绕过ASP.NET请求大小限制。

答案 7 :(得分:-1)

我认为你应该使用Response.TransmitFile,这种方法不会在web服务器内存中加载文件,它会在不使用Web服务器资源的情况下流式传输文件。

if (Controller.ValidateFileExist())
        {
            ClearFields();
            Response.Clear();
            Response.ContentType = "text/plain";
            Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", "FileNAme.Ext"));
            Response.TransmitFile(FileNAme.Ext);
            Response.End();
            Controller.DeleteFile();
        }