2012-02-14 15 views
5

W ASP.Net (z C#) próbuję utworzyć plik .DAT z czystym tekstem i wysłać go do przeglądarki i wymusić pobieranie. Próbowałem kilku rzeczy, ale nie mogę tego uruchomić. W moim aspx akt istnieje ImageButtonWymuszenie pobrania ASP.Net

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

W OnClick-metody Próbuję utworzyć plik i przesłać go do przeglądarki.

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

Plik test.dat znajduje się we właściwym folderze i musi zostać usunięty po przeczytaniu w bajtach. Próbowałem tego bez usuwania pliku i to też nie działa.

Po kliknięciu przycisku btnZapisz, przycisk musi być ukryty, dlatego ustawiam parametr Visible na false.

Próbowałem również z content-type "application/octet-stream" lub z plikiem PDF i typem treści "application/pdf", ale nic nie działa. Strona ładuje się normalnie i nie jest pobierany żaden plik.

+0

Podejrzewam, że część odpowiedzi zostanie wysłana przed nagłówkami. Nie rozumiem też, w jaki sposób spodziewasz się jednej odpowiedzi, aby pobrać plik, i uczynić przycisk niewidoczny w tym samym czasie. – CodesInChaos

+0

Pomyślałem coś podobnego, ale jak mogę to zrobić? – Yoni

+1

Na marginesie: spójrz na 'File.ReadAllBytes', który może zastąpić 5 linii, których używasz do odczytania pliku. Powinieneś to robić tylko z bardzo małymi plikami, może nawet do 10kB. – CodesInChaos

Odpowiedz

3

Czy ścieżka pliku jest rzeczywiście poprawna?

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

Czy to nie nazwa pliku?

Dlaczego usuwasz plik, zanim zostanie zapisany w odpowiedzi? Czy nie byłoby bardziej sensowne podawanie pliku poprzez odpowiedź, a następnie usunięcie go?

to wywołać

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

po repsonse.

Należy starać:

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

TransmitFile jest bardzo skuteczna, ponieważ w zasadzie odciąża pliku strumieniowego do IIS w tym potencjalnie powodując plik, aby uzyskać buforowane w pamięci podręcznej Kernal (na podstawie zasad buforowania IIS). Response.End();

+0

Próbowałem już bez usuwania pliku, ale to też nie działa. W metodzie AddHeader musi zostać wypełniona tylko sugerowana nazwa pliku. Więc nie pełna ścieżka, ale tylko sugestia dla nazwy pliku. – Yoni

+0

Czy próbowałeś Response.TransmitFile()? Zamiast BinaryWrite()? – Seany84

+0

Po prostu wypróbowałem, ale sam wynik: – 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(); 
Powiązane problemy