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文件。此方法可向后使用,用于下载或上载大文件,让我看看是否可以找到文档。”