2012-02-14 33 views
5

Trong ASP.Net (với C#) Tôi đang cố gắng tạo tệp .DAT với văn bản thuần túy trong đó và gửi tệp đó đến trình duyệt và tải xuống lực. Tôi đã thử nhiều thứ nhưng tôi không thể làm việc đó được. Trong aspx-file của tôi có một ImageButtonTải xuống ASP.Net

<asp:ImageButton ID="btnSave" runat="server" CausesValidation="False" ImageUrl="~/Images/Stages/Database/Save.png" OnClick="btnSave_OnClick" Width="26px" /> 

Trong OnClick-phương pháp Tôi đang cố gắng để tạo ra các tập tin và gửi nó đến trình duyệt.

protected void btnSave_OnClick(object sender, EventArgs e) 
{ 
    string file = "test.dat"; 
    string fileName = "~\\Stages\\Broekx\\Databanken\\" + file; 

    FileStream fs = new FileStream(MapPath(fileName), FileMode.Open); 
    long cntBytes = new FileInfo(MapPath(fileName)).Length; 
    byte[] byteArray = new byte[Convert.ToInt32(cntBytes)]; 
    fs.Read(byteArray, 0, Convert.ToInt32(cntBytes)); 
    fs.Close(); 

    ImageButton btnSave = (ImageButton)FormViewStagesDummy.FindControl("btnSave"); 
    btnSave.Visible = false; 

    File.Delete(Server.MapPath(fileName)); 

    if (byteArray != null) 
    { 
     this.Response.Clear(); 
     this.Response.ContentType = "text/plain"; 
     this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 
     this.Response.BinaryWrite(byteArray); 
     this.Response.End(); 
     this.Response.Flush(); 
     this.Response.Close(); 
    } 
} 

Tệp test.dat tồn tại trong thư mục chính xác và phải bị xóa sau khi đã được đọc thành byte. Tôi đã thử điều này mà không xóa các tập tin và đó sẽ không làm việc hoặc.

Sau khi nhấp vào btnLưu nút phải được ẩn, vì vậy đó là lý do tôi đặt tham số Hiển thị thành sai.

Tôi cũng đã thử nó với loại nội dung "ứng dụng/octet-stream" hoặc với tệp PDF và loại nội dung "application/pdf" nhưng không có gì hoạt động. Trang tải bình thường và không có tệp nào đang được tải xuống.

+0

Tôi nghi ngờ một phần phản hồi sẽ được gửi trước tiêu đề. Tôi cũng không hiểu làm thế nào bạn mong đợi một phản ứng duy nhất để tải về một tập tin, và làm cho một nút vô hình cùng một lúc. – CodesInChaos

+0

Tôi đã nghĩ điều gì đó tương tự nhưng làm cách nào tôi có thể thực hiện công việc này? – Yoni

+1

Như một lưu ý phụ: xem 'File.ReadAllBytes' có thể thay thế 5 dòng bạn sử dụng để đọc tệp. Bạn chỉ nên làm điều đó với các tệp rất nhỏ, có thể lên đến 10kB. – CodesInChaos

Trả lời

3

Đường dẫn của chuỗi tệp có thực sự chính xác không?

this.Response.AddHeader("content-disposition", "attachment;filename=" + file); 

Nếu nó không phải là tên tệp?

Tại sao bạn xóa tệp trước khi tệp được ghi vào phản hồi? Nó sẽ không có ý nghĩa hơn để phục vụ các tập tin thông qua các phản ứng và sau đó xóa nó?

ví dụ: gọi

File.Delete(Server.MapPath(fileName)); 

sau repsonse.

Bạn nên thử:

Response.TransmitFile(Server.MapPath(fileName)); 
Response.End(); 

TransmitFile là rất hiệu quả vì nó về cơ bản offloads các tập tin trực tuyến để IIS bao gồm cả khả năng gây ra các tập tin để lưu trữ trong bộ nhớ cache Kernal (dựa trên các quy tắc bộ nhớ đệm IIS của). Response.End();

+0

Tôi đã thử mà không xóa tệp nhưng nó cũng không hoạt động. Trong phương thức AddHeader chỉ có tên được gợi ý của tệp cần được lấp đầy. Vì vậy, không phải là con đường hoàn chỉnh, nhưng chỉ có một gợi ý cho tên tập tin. – Yoni

+0

Bạn đã thử Response.TransmitFile() chưa? Thay vì BinaryWrite()? – Seany84

+0

Chỉ cần thử nó nhưng kết quả tương tự – Yoni

0
   Response.Clear(); 
       Response.ClearContent(); 
       Response.ClearHeaders(); 
       Response.ContentType = "text/plain"; 
       Response.AppendHeader("Content-Disposition", "attachment; filename = " + fileName); 
       Response.TransmitFile(Server.MapPath("~/foldername/" + fileName)); 
       Response.End();