2011-10-17 10 views
1

私はASP.netにWebアプリケーションを作成しています。ASP.Net送信ファイル

サーバーから何かをダウンロードするためのファイルダイアログボックスを表示しようとしています。

ファイルと呼ばれる変数に適切なファイルデータが格納されています。

ファイルのフィールドがあります。 のFileType - MIMEタイプファイルの
ファイルパス - サーバ側のファイルパス

はここで、これまでのコードです:

Response.Clear(); 
Response.ContentType = file.FileType; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 
Response.TransmitFile(file.FilePath) ; 
Response.End(); 

GetFileNameは私を取得する機能であります添付ファイルオブジェクトからのファイル名私はパスを保存するだけです。

上記のコードは、クリック時にトリガーするイベントである「Download_Clicked」という機能にあります。イベントはLinkBut​​tonにマップされます。

問題は、上記のコードを実行すると何も起こりません。標準のダイアログボックスは表示されません。

ファイルが存在することを確認し、パスが正しいことを確認するなど、標準的なトラブルシューティングを試みました。彼らはどちらもマーク上で死んでいる。

私のマシンはサーバでもあるので、何とか正しく処理されていない可能性があります。

ありがとうございます。

編集1:別のページにコントロールを入れようとしましたが正常に動作します。

編集2:AJAXアップデートパネルからコントロールを削除して問題を解決しました。

+0

IISはMIMEタイプを認識していますか? "application/octet-stream"を使ってみましたか? –

+0

私はオクテットストリームのMIMEタイプを試みましたが、まだ行っていません。 – wanderingloki

+2

Ajax Updateパネルは、FileUploadコントロールやResponseを使用してファイルをダウンロードするとうまく動作しません。 MSAjaxライブラリには、レスポンスストリームを変更するとエラーがスローされるセキュリティ対策が組み込まれています。動的に生成されるファイルをダウンロードする一般的な方法は、セッション変数にファイルデータを一時的に格納し、ページロード時にセッション変数を特定してブラウザに送信するページにユーザーをリダイレクトすることです。また、httpハンドラでこれを行うこともできますし、アップデートパネルの外にあるファイルアップロード/ダウンロードコントロールをそのまま残すこともできます。 –

答えて

0

最初の投稿の編集を参照してください。

エラーを解決するためにAjax更新パネルを削除しました。パネルはポストをサーバーに戻して停止していました。

詳細については、Cris Valenzuelaのコメントを参照してください。

0

することは問題が解決しない場合、あなたは常にここで、Webブラウザ にファイルをストリーミングするResponse.BinaryWriteまたはResonse.Writeを使用することができます

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  Path.GetFileName(GetFileName(file)))); 

Response.AppendHeader("Content-Disposition", "attachment; filename=" +  GetFileName(file)); 

を変えて試してみてくださいどのようにResponse.WriteまたはResponse.BinaryWriteを使用してファイルを送信する。

public void SendFileToBrowser(String FileName, String MIMEType, String FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.Write(FileData); 
     Response.End(); 
    } 

    public void SendFileToBrowser(String FileName, String MIMEType, Byte[] FileData) 
    { 
     Response.Clear(); 
     Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName); 
     Response.ContentType = MIMEType; 
     Response.Buffer = true; 
     Response.BinaryWrite(FileData); 
     Response.End(); 
    } 

を必要に応じて次にどこかではなく、そう

SendFileToBrowser("FileName.txt", "text/plain", "Don't try this from an Update Panel. MSAjax does not like it when you mess with the response stream."); 
+0

申し訳ありませんが、修正されませんでした。まだ何も得ていない。 – wanderingloki

+0

Response.WriteFileを使用してファイル –

0

使用Response.WriteFile()のようなこれらの関数を呼び出すそれらを呼び出すどこか、ライブラリでこれらの機能を入れてください。

また、Response.End()を使用しないでください!これにより、スレッドが異常終了します。使用Response.Flush(); Response.Close();

+0

を送信しようとすると、Response.WriteメソッドとResponse.BinaryWriteメソッドが追加されました。珍しいことは、私がコントロールを取ってそれを別のページに投げてしまって、うまくいきました。しかし、私はそれを置く最初のページで動作しません。 – wanderingloki

+0

'Response.ContentType = file.FileType;' - コンテンツタイプはMIMEコンテンツタイプ、* not *ファイルタイプです。一般的なコンテンツタイプのリストについては、クライアントに出力するファイルと一致するようにgoogleを設定できます。 「破損した」ページがヘッダーを送信していないことを確認します。これらのヘッダーはクライアントに送信された後は再送信できません。 – Leon

+0

file.FileTypeはファイルのMIMEタイプです。その出力にのみ使用されます。これは、クライアントに何かを送信する唯一の機能です。ページには何も送信されません。 – wanderingloki

3

更新パネルを削除せずにこれを行う方法を見つけました。下のコードをページの読み込み場所に配置すると、そのボタンを使用してダウンロードを開始できるようになります。

ScriptManager.GetCurrent(this.Page).RegisterPostBackControl(Button);

関連する問題