开发者

Upload Large files(1GB)-ASP.net

I need to upload large files of at least 1GB file size. I am using ASP.Net, C# and IIS 5.1 as my development platform.

I am using:

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

before using:

File.WriteAllBytes(filePath, fileByteArray)

(doesnt go here but gives System.OutOfMemoryException exception)

Cu开发者_如何学JAVArrently I have set the httpRuntime to:

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

Also i have set maxAllowedContentLength="**2097151**" (guess its only for IIS7)

I have changed IIS connection timeout to 999,999 secs too.

I am unable to upload files of even 4578KB (Ajaz-Uploader.zip)


We have an app that occasionally needs to upload 1 and 2 GB files, so has been running into this as well. After much research, my conclusion is that we need to implement the previously mentioned NeatUpload, or something like it.

Also, be aware that

<requestLimits maxAllowedContentLength=.../>

is measured in bytes, while

<httpRuntime maxRequestLength=.../>

is measured in kilobytes. So your values should look more like this:

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


I know it is an old question, but still unanswered.

So this is what you have to do:

In you web.config file, add this in :

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

and this under

<security>
    <requestFiltering>

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

    </requestFiltering>
</security>

You see in the comment how this works. In one you need to have the sie in bytes and in the other one in kilobytes. Hope that helps.


I googled and found - NeatUpload


Another solution would be to read the bytes on the client and send it to the server, the server saves the file. Example

Server: in Namespace - Uploader, class - Upload

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

Client:

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


Try copying without loading every thing in the memory :

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;
}


I think you should use Response.TransmitFile, this method does not load in web server memory the file, it streams the file without using web server resources.

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();
        }


Check this blog entry about large file uploads. It also has a few links to some discussion forums that can shed some light on this as well. The suggestion is to use custom HttpHandler for that or custom Flash/Silverlight control.


For IIS 6.0 you can change AspMaxEntityAllowed in Metabase.xml, but I don't think it's as straight forward in IIS 5.1.

This link may help, hope it does:

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


Setting maxRequestLength should be enough for uploading files larger than 4mb, which is the default limit for HTTP request size. Please make extra sure that nothing is overriding your config file.

Alternatively you can check the async upload provided by Telerik, which uploads files by 2mb chunks and effectively can bypass the ASP.NET request size limitation.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜