2008-09-01 27 views
23

Cách tốt nhất để triển khai, từ trang web là hành động tải xuống bằng asp.net 2.0?Làm cách nào để thực hiện tải xuống tệp trong asp.net

Tệp nhật ký cho một hành động được tạo trong một thư mục có tên [Application Root]/Logs. Tôi có đường dẫn đầy đủ và muốn cung cấp một nút, rằng khi nhấp vào sẽ tải xuống tệp nhật ký từ máy chủ IIS đến máy tính cục bộ của người dùng.

+0

Bạn có sử dụng Response.TransmitFile (cho một tệp nhỏ không? –

Trả lời

33

Liệu trợ giúp này:

http://www.west-wind.com/weblog/posts/76293.aspx

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Response.TransmitFile là cách chấp nhận gửi các file lớn, thay vì Response.WriteFile.

+7

Một phần quan trọng trong số này là Response.End() - không có nó, bạn sẽ kết thúc với tải xuống bị hỏng, chữ ký số bị hỏng, tất cả các loại kỳ quặc –

+0

Nó không hoạt động với các tập tin PNG .. Làm thế nào tôi nên làm điều đó? –

+0

Điều này có thể được sử dụng hoặc sửa đổi để lấy một tập tin từ xa từ một URL khác? – AlexVPerl

10

http://forums.asp.net/p/1481083/3457332.aspx

string filename = @"Specify the file path in the server over here...."; 
FileInfo fileInfo = new FileInfo(filename); 

if (fileInfo.Exists) 
{ 
    Response.Clear(); 
    Response.AddHeader("Content-Disposition", "attachment; filename=" + fileInfo.Name); 
    Response.AddHeader("Content-Length", fileInfo.Length.ToString()); 
    Response.ContentType = "application/octet-stream"; 
    Response.Flush(); 
    Response.TransmitFile(fileInfo.FullName); 
    Response.End(); 
} 


Cập nhật:

Mã ban đầu

Response.AddHeader("Content-Disposition", "inline;attachment; filename=" + fileInfo.Name); 

có "inline; tập tin đính kèm", tức là hai giá trị cho Disposition nội dung.

Không biết chính xác thời điểm bắt đầu, nhưng trong Firefox chỉ tên tệp thích hợp không xuất hiện. Hộp tải xuống tệp xuất hiện với tên của trang web và phần mở rộng của trang web (pagename.aspx). Sau khi tải về, nếu bạn đổi tên nó trở lại tên thật; tệp mở thành công.

Theo this page, hoạt động trên Cơ sở đến trước được phục vụ trước. Thay đổi giá trị thành attachment chỉ giải quyết được vấn đề.

PS: Tôi không chắc đây có phải là phương pháp hay nhất hay không nhưng vấn đề đã được giải quyết.

+2

-1: Như Martin nói, sử dụng TransmitFile thay vì WriteFile. bị hỏng cho các tệp lớn – Niki

+0

+1 để sửa câu trả lời! – bnieland

+0

Tôi đang thực hiện việc này bằng một nút bên trong ModalPopupExtender điều hành bảng cập nhật và nó sẽ không hoạt động. Tuy nhiên, nếu tôi di chuyển nút bên ngoài khu vực modalpopup/updatepanel nó hoạt động hoàn hảo? Bất kỳ ý tưởng làm thế nào để có được xung quanh này? – JoeManiaci

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