2008-12-03 29 views
6

Tôi có một cơ sở dữ liệu sql lưu trữ một số tài liệu.C# ASP.NET 3.5 giải quyết các vấn đề về tải tệp nội dung

Người dùng có thể đăng nhập vào ứng dụng và xem danh sách tài liệu của họ.

Khi nhấp vào liên kết tải xuống nút trong chế độ xem lưới tài liệu của chúng, tôi lấy tệp từ cơ sở dữ liệu, ghi tệp đó vào hệ thống tệp và sau đó thực thi mã này.

System.IO.FileInfo file = new System.IO.FileInfo(System.Configuration.ConfigurationManager.AppSettings["UploadPath"] + DocumentName); 

    Response.Clear(); 
    Response.ClearContent(); 
    Response.ClearHeaders(); 
    Response.Cookies.Clear(); 
    Response.Cache.SetCacheability(HttpCacheability.Private); 
    Response.CacheControl = "private"; 
    Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; 
    Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; 
    Response.AppendHeader("Content-Length", file.Length.ToString()); 
    Response.AppendHeader("Pragma","cache"); 
    Response.AppendHeader("Expires", "60"); 
    Response.ContentType = GetContentType(file.Extension); 
    Response.AppendHeader("Content-Disposition", 
    "inline; " + 
    "filename=\"" + file.Name + "\"; " + 
    "size=" + file.Length.ToString() + "; " + 
    "creation-date=" + DateTime.Now.ToString("R") + "; " + 
    "modification-date=" + DateTime.Now.ToString("R") + "; " + 
    "read-date=" + DateTime.Now.ToString("R")); 

My GetContentType() phương pháp chỉ trả về kiểu tập tin thích hợp cho các tập tin tôi là cho phép "application/pdf, application/msw0rd vv

Vấn đề của tôi là khi các tập tin được lưu, đó là trang web của chính nó, không phải là tập tin từ hệ thống tập tin. Và trong google chrome, nó đặt một phần mở rộng .htm ở cuối tên tập tin, tôi đoán bởi vì nó biết đó là một trang web? bước sẽ là để có được các tập tin thực tế, và không phải là một bản sao của trang web trong HTML họ đang ngồi trên!

Cảm ơn.

Trả lời

9

Bạn gửi nội dung thực sự của tệp như thế nào?

I thường sử dụng phương pháp Response.TransmitFile, về cơ bản nó sẽ mở tệp và gửi nội dung của nó tới Response.OutputStream

3

Bạn đã thử đặt bố cục nội dung thành "tệp đính kèm" thay vì "nội tuyến" chưa? Tôi tin rằng trình duyệt sau đó sẽ nhắc người dùng mở hoặc lưu tài liệu.

Ngoài ra, bạn thường có thể bỏ qua hệ thống tệp bằng cách ghi luồng byte từ cơ sở dữ liệu trực tiếp vào đối tượng Phản hồi bằng phương pháp BinaryWrite ... Đây cũng là trường hợp bạn có thể muốn điều tra bằng cách sử dụng Trình xử lý HTTP thay thế một trang ASPX để bạn không cần phải lo lắng về việc xóa Phản hồi, v.v. Tôi đã thành công trong quá khứ bằng cách sử dụng khung nội tuyến ẩn trên trang, sau đó sử dụng Javascript để đặt src của nó thành Trình xử lý HTTP lấy tài liệu ID làm tham số trên QueryString.

9

Thay vì

Response.AppendHeader ("Content-Disposition", "inline;" + "filename =

sử dụng

Response.AddHeader (" Content-Disposition:", "attachment; filename =

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