user193647
user193647

Reputation:

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)

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

Upvotes: 10

Views: 59761

Answers (8)

Manish Sinha
Manish Sinha

Reputation: 2112

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

Upvotes: 4

Shawn South
Shawn South

Reputation: 597

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"/>

Upvotes: 10

damir
damir

Reputation: 2028

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.

Upvotes: 4

Genady Sergeev
Genady Sergeev

Reputation: 1650

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.

Upvotes: 0

adrianos
adrianos

Reputation: 1561

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

Upvotes: 0

Manitra Andriamitondra
Manitra Andriamitondra

Reputation: 1249

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

Upvotes: 1

Audrius
Audrius

Reputation: 2848

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.

Upvotes: 0

Arturo Caballero
Arturo Caballero

Reputation: 438

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

Upvotes: 0

Related Questions