2009-10-21 34 views
6

Tôi cần tải lên các tệp lớn có kích thước tệp tối thiểu là 1GB. Tôi đang sử dụng ASP.Net, C#IIS 5.1 làm nền tảng phát triển của mình.Tải lên các tệp lớn (1GB) -ASP.net

Tôi đang sử dụng:

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

trước khi sử dụng:

File.WriteAllBytes(filePath, fileByteArray) 

(doesnt đi ở đây nhưng cho System.OutOfMemoryException ngoại lệ)

Hiện nay tôi đã thiết lập các httpRuntime tới:

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

Ngoài ra tôi đã thiết maxAllowedContentLength="**2097151**" (đoán nó chỉ cho IIS7)

tôi đã thay đổi IIS thời gian chờ kết nối đến 999.999 giây quá.

tôi không thể upload file thậm chí 4578KB (Ajaz-Uploader.zip)

Trả lời

0

Cố gắng sao chép mà không cần nạp tất cả mọi thứ trong bộ nhớ:

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

Xin chào manitra, Tôi đã thử sử dụng hàm CopyFile() của bạn trong ứng dụng khách và Sao chép() trong máy chủ, nhưng tôi đã gặp một số lỗi. Một điều nữa tôi đã quan sát được là WriteAllBytes sẽ làm việc cho đến 3MB dữ liệu, nhiều hơn nó mang lại cho "System.Web.Services.Protocols.SoapException: System.Web.Services.Protocols.SoapException: Có một ngoại lệ đang chạy các phần mở rộng được chỉ định trong tệp cấu hình. ---> System.Web.HttpException: Thời lượng yêu cầu tối đa vượt quá ..... "ngoại lệ. –

0

Kiểm tra this blog entry về tập tin tải lên lớn. Nó cũng có một vài liên kết đến một số diễn đàn thảo luận có thể làm sáng tỏ điều này. Đề xuất là sử dụng HttpHandler tùy chỉnh cho điều khiển Flash/Silverlight tùy chỉnh hoặc tùy chỉnh đó.

3

Tôi googled và thấy - NeatUpload


Một giải pháp khác sẽ được đọc các byte trên máy khách và gửi nó đến máy chủ, máy chủ lưu các tập tin. Ví dụ

Server: trong Namespace - Uploader, lớp - 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; 
} 

Chủ đầu tư:

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

Tôi chưa kiểm tra mã. Không chắc chắn điều này hoạt động, chỉ muốn truyền đạt ý tưởng. Đây gần như những gì FTP làm, ngoại trừ việc thay vì cổng 20/21, mọi thứ đang diễn ra trên cổng 80. –

+0

Wow! Tôi rất vui vì bạn đã đề cập đến NeatUpload. Tôi lấy một bản sao cho bản thân mình và nó làm cho việc tải lên dễ dàng hơn cho tôi để thêm vào dự án của tôi. Cảm ơn. –

-1

Tôi nghĩ rằng bạn nên sử dụng Response.TransmitFile, phương pháp này không được tải trong bộ nhớ máy chủ web của tập tin, nó suối tập tin mà không sử dụng web tài nguyên máy chủ.

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

Không mở tệp trong bộ nhớ, bạn sẽ gỡ máy chủ xuống !! Với tất cả sự tôn trọng, tất cả các giải pháp khác được đăng dường như hoạt động với các tệp nhỏ, nhưng không phải với các tệp 1Gig –

+0

Phương pháp này có thể được sử dụng ngược lại, để tải xuống hoặc tải lên các tệp lớn, hãy để tôi xem liệu tôi có thể tìm thấy tài liệu hay không –

5

Chúng tôi có một ứng dụng thỉnh thoảng cần tải lên 1 và 2 GB tệp, vì vậy cũng đã chạy vào tệp này. Sau nhiều nghiên cứu, kết luận của tôi là chúng ta cần phải thực hiện các đề cập trước đây NeatUpload, hoặc một cái gì đó như nó.

Ngoài ra, lưu ý rằng

<requestLimits maxAllowedContentLength=.../> 

được đo bằng byte, trong khi

<httpRuntime maxRequestLength=.../> 

được đo bằng kilobyte. Vì vậy, giá trị của bạn sẽ trông giống như thế này:

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

Đặt maxRequestĐộ dài đủ để tải lên tệp lớn hơn 4mb, là giới hạn mặc định cho kích thước yêu cầu HTTP. Vui lòng đảm bảo rằng không có gì là ghi đè tệp cấu hình của bạn.

Hoặc bạn có thể kiểm tra async upload provided by Telerik, tải lên tệp theo khối 2MB và có hiệu quả có thể bỏ qua giới hạn kích thước yêu cầu ASP.NET.

1

Tôi biết đó là câu hỏi cũ nhưng vẫn chưa được trả lời.

Vì vậy, đây là những gì bạn phải làm:

Trong bạn file web.config, thêm này trong:

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

và điều này dưới

<security> 
    <requestFiltering> 

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

    </requestFiltering> 
</security> 

Bạn thấy trong các bình luận cách này hoạt động. Trong một bạn cần phải có sie trong byte và trong một khác trong kilobyte. Hy vọng rằng sẽ giúp.

Các vấn đề liên quan