C# 上载大文件(1GB)-ASP.net

C# 上载大文件(1GB)-ASP.net,c#,.net,C#,.net,我需要上传至少为1GB文件大小的大文件。 我正在使用ASP.Net、C和iis5.1作为我的开发平台 我正在使用: HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength) 使用前: File.WriteAllBytes(filePath, fileByteArray) (不在此处,但给出System.OutOfMemoryExceptionexception) 目前我已将httpRuntime设置为:

我需要上传至少为
1GB
文件大小的大文件。 我正在使用
ASP.Net
C
iis5.1
作为我的开发平台

我正在使用:

HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength)
使用前:

File.WriteAllBytes(filePath, fileByteArray)
(不在此处,但给出
System.OutOfMemoryException
exception)

目前我已将
httpRuntime
设置为:

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

我还设置了
maxAllowedContentLength=“**2097151**”
(估计它只适用于IIS7)

我已将IIS连接超时时间更改为999999秒


我甚至无法上载4578KB的文件(Ajaz Uploader.zip)

请尝试在不加载内存中所有内容的情况下进行复制:

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;
}
public void CopyFile()
{
Stream source=HIF.PostedFile.InputStream;//源文件
流目的地=File.OpenWrite(filePath);//您的目的地
副本(来源、目的地);
}
公共静态长拷贝(从、流到)
{
长拷贝字节数=0;
字节[]缓冲区=新字节[2 0;)
{
写入(缓冲区,0,len);
copiedByteCount+=len;
}
to.Flush();
返回复制字节数;
}
检查大文件上传。它还有一些指向一些论坛的链接,也可以对此有所帮助。建议使用定制的HttpHandler或定制的Flash/Silverlight控件。

我在谷歌上搜索并发现-


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

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

[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);

对于IIS 6.0,您可以在Metabase.xml中更改AspMaxEntityAllowed,但我认为在IIS 5.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();
        }

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

此外,请注意

<requestLimits maxAllowedContentLength=.../>

字节测量,而

<httpRuntime maxRequestLength=.../>

是以千字节测量的。因此,您的值应该如下所示:

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

...

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


或者,您可以检查,它以2mb块上传文件,有效地绕过ASP.NET请求大小限制。

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

这就是你要做的:

在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>


您可以在评论中看到这是如何工作的。其中一个需要sie以字节为单位,另一个需要sie以KB为单位。希望这能有所帮助。

我还没有检查代码。不确定这是否有效,只是想传达这个想法。这几乎就是FTP的功能,除了端口20/21之外,所有事情都在端口80上发生。哇!我很高兴你们我自己拿了一个副本,这让我可以很容易地将它添加到我的项目中。谢谢。我在br.ReadBytes()处出现内存不足异常。文件大小~700MB你好,manitra,我尝试在客户端和copy()中使用你的函数CopyFile()在服务器中,但我发现了一些错误。我观察到的另一件事是,writealBytes可以工作到3MB的数据,比它提供的数据还要多“System.Web.Services.Protocols.SoapException:System.Web.Services.Protocols.SoapException:运行配置文件中指定的扩展名时出现异常。-->System.Web.HttpException:超出了最大请求长度…”。。。。。“例外。不要在内存中打开文件,你将关闭服务器!!恕我直言,所有其他发布的解决方案似乎都适用于小文件,但不适用于1Gig文件。此方法可向后使用,用于下载或上载大文件,让我看看是否可以找到文档。”