2012-02-14 15 views
5

ASP.Net(C#付き)ではプレーンテキストの.DATファイルを作成してブラウザに送信し、強制的にダウンロードしようとしています。私はいくつかのことを試しましたが、それを働かせることはできません。私のaspxファイルでは、私はファイルを作成し、それをブラウザに送信しようとしているのOnClick-方法でImageButton強制ダウンロードASP.Net

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

があります。

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

ファイルtest.datは正しいフォルダに存在し、バイトに読み込まれた後で削除する必要があります。私はファイルを削除せずにこれを試してみたが、どちらもうまくいきません。

btnSaveをクリックした後、ボタンを非表示にする必要があります。そのため、パラメータVisibleをfalseに設定します。

コンテンツタイプ「application/octet-stream」やPDFファイルとコンテンツタイプ「application/pdf」でも試してみましたが、何も機能しません。ページは正常にロードされ、ファイルはダウンロードされません。

+0

私は、応答の一部がヘッダーの前に送信されると思われます。また、1つのレスポンスでファイルをダウンロードし、同時にボタンを見えないようにする方法を理解していません。 – CodesInChaos

+0

私は何か類似していると思ったが、どうすればこの仕事をすることができますか? – Yoni

+1

サイドノートとして:あなたがファイルを読むのに使う5行を置き換えることができる 'File.ReadAllBytes'を見てください。非常に小さいファイル(おそらく最大10kB)でのみ行うべきです。 – CodesInChaos

答えて

3

ファイル文字列のパスは実際に正しいですか?

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

ファイル名ではありませんか?

なぜファイルをレスポンスに書き込む前にファイルを削除していますか?それは、応答を介してファイルを提供し、それを削除するより意味をなさないでしょうか?

すなわちrepsonse後

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

を呼び出します。

あなたが試してみてください:それは基本的には潜在的に(IISのキャッシュ・ルールに基づく)は、カーネル・キャッシュにキャッシュ取得するためにファイルを引き起こし含むIISへのストリーミングファイルをオフロードするので

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

をTransmitFileは非常に効率的です。 Response.End();

+0

私はファイルを削除せずに試しましたが、どちらもうまくいきません。 AddHeaderメソッドでは、ファイルの推奨名のみを埋めなければなりません。完全なパスではなく、ファイル名の提案だけです。 – Yoni

+0

Response.TransmitFile()を試しましたか? BinaryWrite()の代わりに? – Seany84

+0

ちょうど試しましたが同じ結果 – 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(); 
関連する問題