2009-05-16 26 views
18

Tôi cần bắt buộc tải xuống tệp .sql, khi người dùng nhấp vào một nút trong ứng dụng web dựa trên ASP .NET (C#) của tôi.Tải xuống một tệp trên máy chủ web - ASP .NET C#

Như trong, khi nút được nhấn vào, một hộp thoại Save As nên mở vào cuối khách hàng ...

Làm thế nào để làm điều này?

EDIT

này được mã Tôi đang sử dụng

 string sql = ""; 
     using (System.IO.StreamReader rdr = System.IO.File.OpenText(fileName)) 
     { 
      sql = rdr.ReadToEnd(); 
     } 
     Response.ContentType = "text/plain"; 
     Response.AddHeader("Content-Disposition", "attachment; filename=Backup.sql"); 
     Response.Write(sql); 
     Response.End(); 

Đây là lỗi mà tôi nhận được ...

alt text http://img40.imageshack.us/img40/2103/erroro.gif

Có chuyện gì vậy?

+0

Bạn không nên làm việc đó như thế trong sự kiện click nút của. Sử dụng Response.Redirect hoặc các phương thức khác để chuyển hướng người dùng đến trang khác trong sự kiện nhấp nút. Xem hướng dẫn trong câu trả lời của tôi. –

Trả lời

29

Tạo một Handler HTTP riêng biệt (DownloadSqlFile.ashx):

<%@ WebHandler Language="C#" Class="DownloadHandler" %> 

using System; 
using System.Web; 

public class DownloadHandler : IHttpHandler { 
    public void ProcessRequest(HttpContext context) { 
     var fileName = "myfile.sql"; 
     var r = context.Response; 
     r.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
     r.ContentType = "text/plain"; 
     r.WriteFile(context.Server.MapPath(fileName)); 
    } 
    public bool IsReusable { get { return false; } } 
} 

Sau đó thực hiện mông trên trang ASP.NET của bạn, hãy điều hướng đến DownloadSqlFile.ashx.

+0

Điều này tốt hơn câu trả lời của tôi về các mẫu thiết kế. –

+5

Điều này làm cho giả định rằng tệp bạn muốn tải xuống là một tệp tĩnh. –

+0

@TimJarvis Trong trường hợp đó, nó sẽ không phải là một tập tin nào cả. Nó sẽ chỉ là một luồng mà bạn có thể xuất ra với '.BinaryWrite()'. Chỉ cần đừng quên 'flush()' – tfrascaroli

18

Bạn cần thông báo cho trình duyệt biết những gì bạn đang gửi không phải là html và không được hiển thị như vậy trong trình duyệt. Các mã sau đây có thể được sử dụng để trả một số văn bản trong mã server-side của bạn và nó sẽ trình bày các hộp thoại cho người sử dụng khi bạn muốn tiết kiệm:

Response.Clear(); //eliminates issues where some response has already been sent 
Response.ContentType = "text/plain"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); 
Response.Write(yourSQL); 
Response.End(); 

filename: tên mà bạn muốn để cho nó

yourSQL: nội dung của file sql

+0

gặp lỗi khi thực hiện việc này. đã thêm ảnh chụp màn hình vào bài đăng câu hỏi. – Sameet

+0

Tôi đang sao chép mã đó ra khỏi một trang mà tôi sử dụng để tải xuống dữ liệu .csv để tôi biết nó hoạt động. Tôi gọi nó trong sự kiện page_load, có lẽ trang của bạn đã bắt đầu gửi dữ liệu về cho khách hàng? –

+0

Mã của tôi nằm trong sự kiện button_click ... tại sao nó cần phải ở trong page_laod()? Tôi cần tải xuống để bắt đầu sự kiện nhấp vào nút ... – Sameet

1

Thêm Response.Clear trước khi bạn Response.Write khắc phục lỗi, nếu được nêu đúng trong hộp thoại Chrome.

Vì vậy, để lồng ghép trong đoạn mã trong câu trả lời khác ...

//add this 
Reponse.Clear(); 

//from other answer 
Response.ContentType = "text/plain"; 
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename)); 
Response.Write(yourSQL); 
Response.End; 
5

Vấn đề là bạn đang sử dụng các mã trên cùng một trang như hiện nay được nạp trong trình duyệt. Bạn đang cố gắng sửa đổi luồng phản hồi và bố trí của trang được tải hiện tại. Thay vào đó, hãy tạo một HttpHandler riêng biệt, theo đề xuất của Mehrdad. Sau đó, nhấp vào nút, bạn sẽ gọi URL tới trình xử lý. Nút thậm chí có thể là một siêu liên kết đơn giản có URL sau đây như URL nguồn:

<a href="DownloadSqlFile.ashx">Download SQL</a> 

Có ý nghĩa? Vấn đề là, bạn không thể sửa đổi phản hồi của trang đã tải. Khởi chạy yêu cầu mới bằng cách sử dụng trình xử lý để thực hiện công việc.

0

Các giải pháp dưới đây làm việc cho tôi

string fileNameAndExtension = "thisFile.pdf";  
string fullPath = "../folder/files/" + fileNameAndExtension;  
Response.Clear(); 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension); 
Response.TransmitFile(fullPath); 
Response.End(); 
Các vấn đề liên quan