2009-07-20 38 views
3

私は、ユーザーがファイルをダウンロードできるようにするASP.NET Webサイトで作業しています。以前のファイルは、私たちは何ができるウェブサイトと同じサーバー上に保存したHTTP経由でファイルを転送するResponse.TransmitFileの代わりに

は:

Response.Clear(); 
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 
Response.AddHeader("Content-Length", response.ContentLength.ToString()); 
Response.ContentType = "application/octet-stream"; 
Response.TransmitFile(path); 
Response.End(); 

しかし、今、ファイルの一部が別々のサーバー上に保存されています。ファイルが存在することを確認できます

WebRequest request = WebRequest.Create(absolute-url); 
WebResponse response = request.GetResponse(); 

しかし、TransmitFileはURLではなく仮想パスを必要とするため、どのように転送を容易にすることができますか?

通常のWebダウンロードのように、私は、ユーザーがどこのファイルを保存するために選択できるようにする必要があります

これを行うための最善の方法は何ですか?

+0

私はナイーブされてお​​りません願っています。他のサーバー上にファイルのURLを持つハイパーリンクを提供することもできます(自分で追跡する場合や、ファイルがクライアントに送信される前に前処理を行いたい場合を除きます)。 – shahkalpesh

答えて

1
  1. 他のサーバーのURLにユーザーをリダイレクトできますか?
  2. 他のサーバーに要求をプロキシすることができます。 "GetResponse"を呼び出すと、ストリームを取得し、その内容をレスポンスオブジェクトに書き出します。
+0

そしてそのためのAPIはReponse.BinaryWriteです。 –

+0

ダウンロードがWebブラウザで通常開くことができるイメージであっても、ユーザーは各インスタンスにファイルを保存するように要求される必要があるため、リダイレクトできません。 リクエストをプロキシする方法の例を教えてください。私はあなたが何を意味するのか分からない! ご意見ありがとうございました – mancmanomyst

+1

唯一の要件は、ファイルを保存するように求められたら、IIS MMCを使用してカスタムHTTPヘッダーをフォルダに追加し、 "Content-Disposition"を "attachment"に設定するだけですあなたはC#でやっている。その後、ファイルへのプレーンリダイレクトが機能します。 – David

0

リモートサーバーのドライブを共有としてマップし、次にTransmitFileを使用できます。サーバーに視線がない場合は、リモートサーバー上でWebDAVを有効にしてから、それらを物理パスにマップしてTransmitFileを使用できます。

2

リモートファイルにはTransferFileを使用できません。 これにはWriteFileを使用できます。

+0

は魅力的に働いた。私は別のサーバー上のパスを使用していたTransmitFileはうまくいかなかったが、これはうまくいく – TruthOf42

5

あなたはこのスニペットに従って、あなたの出力ストリームにストリームをコピーすることができるはずWeb要求を経由して応答ストリームを得ることができる場合:

while ((read = stream.Read(buffer, offset, chunkSize)) > 0)  
{ 

    Response.OutputStream.Write(buffer, 0, read); 
    Response.Flush(); 
} 
関連する問題