2017-02-27 11 views
0

HTTPHandlerのHTTPレスポンスで、カスタム形式のプレーンテキストファイルをダウンロードしようとしています。ファイルは数字、文字、 "|"デリミタとして。ファイルは実行時に生成され、保存されません。HTTPハンドラのレスポンスからファイルをダウンロードできません

ハンドルもJavaScript関数にデータを返すために使用されているため、ファイルをダウンロードするときに応答を閉じることができません。

現在、これはファイルのダウンロードに使用されているコードです。

MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms); 
tw.Write(file1); 
byte[] bytes = ms.ToArray(); 
ms.Close(); 

context.Response.Clear(); 
context.Response.ContentType = "text/plain"; 
context.Response.AddHeader("content-disposition", "attachment; filename=file.15"); 
context.Response.AppendHeader("Content-Length", bytes.Length.ToString()); 
context.Response.BinaryWrite(bytes); 

context.Response.Flush(); 
context.Response.Close(); 

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = query["File1"], File2 = query["File2"] })); 

ただし、このコードを実行するとエラーはなく(サーバー側とクライアント側の両方)、ファイルはダウンロードされません。

+2

なぜあなたはそれを閉じてからフラッシュした後にレスポンスに書き込みますか? –

+0

.aspxページのJavaScriptコードにデータを送り返そうとしています。ハンドラとリクエスト/レスポンスの仕組みがまだ比較的新しいので、私がファイルを出力するすべての例が応答をフラッシュ、クローズ、または終了するたびにこれを行う方法がわかりません。したがって、このハンドラを使用して、両方のタスク(ファイルのダウンロードとデータの返却)を実行するのが難しいです。 – user3148942

+0

あなたは単純にできません。 –

答えて

0

レスポンスを使用してファイルをダウンロードするには、レスポンスを閉じる必要があるため、ハンドラを使用して両方のアクションを実行することは不可能です(Patrick Hofmanのコメントに記載されているように)。

解決策として、ハンドラはファイルのバイトストリーム(または文字列)をレスポンスに書き込んでから、JavaScript経由でダウンロードすることができます。ハンドラに次のコードを使用して

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 })); 

データを戻すために、その後、JavaScriptでこのコードを使用:

function Download(response) {   
     DownloadFile("File1.15", response.File1); 
     DownloadFile("File2.15", response.File2);   
    } 
function DownloadFile(filename, data) { 
     var blob = new Blob([data], { type: 'text/plain' }); 
     if (window.navigator.msSaveOrOpenBlob) { 
      window.navigator.msSaveBlob(blob, filename); 
     } 
     else { 
      var elem = window.document.createElement('a'); 
      elem.href = window.URL.createObjectURL(blob); 
      elem.download = filename; 
      document.body.appendChild(elem); 
      elem.click(); 
      document.body.removeChild(elem); 
     } 
    } 

は、ファイルをダウンロードします。

これは、単一のハンドラ呼び出しで複数のファイルをダウンロードし、ハンドラ内で生成された他の情報(成功やメッセージなど)を返す可能性を与えます。メソッドDownloadは、ハンドラの正常終了時に呼び出されます。

ただし、サイトではブラウザに複数のファイル権限をダウンロードする必要があります。

関連する問題