2017-04-18 11 views
0

にストリーム私は私がバイトは4GBの周りに巨大なものとし、それを書くことが心配ですが、私は私のバイト配列C#のチャンクがHTTP repsonse

byte[] bytes = viewer.LocalReport.Render("PDF", null, out mimeType, 
            out encoding, 
            out extension, out streamIds, out warnings); 

Response.Buffer = true; 
Response.Clear(); 
Response.ContentType = mimeType; 
Response.AddHeader("content-disposition", "attachment; filename=" + fileName + "." + extension); 
Response.BinaryWrite(bytes); // create the file 
Response.Flush(); // send it to the client to download 

を構築し、ここで

https://forums.asp.net/t/1556522.aspx?RDLC+Export+directly+to+Excel+or+PDF+from+codebehind 

からコードを採用していますhttpレスポンスをチャンクでストリーミングする必要があります。

私は.netバージョン4.6になっています。どのようにストリームをチャンクで応答オブジェクトに書き込むことができますか? バイトが大きい場合にResponse.BinaryWrite(bytes)が死んで、それを置き換える予定があるのですがどうすればいいのでしょうか?

私の研究は、renderメソッドは、どのように私は、チャンクHTTP応答へのストリームコールバックからのデータが任意の手掛かりをオブジェクトんストリームオブジェクトに

public void Render(
    string format, 
    string deviceInfo, 
    CreateStreamCallback createStream, 
    out Warning[] warnings 
) 

をレンダリングすることができますか? https://msdn.microsoft.com/en-us/library/ms252172.aspx

に連れて行ってくれましたか

+0

PDFが4GBを超えると、それを見ている人にとって本当の問題になります;) 各チャンクでファイル読み込みチャンクをループして、BinaryWriteを実行する必要があります。 – Charlie

答えて

0

戻りFileResultとMIMEタイプとしてoctet-streamを定義します。これは、ストリーミングするとブラウザがファイル名に基づいてファイルタイプを把握します

public FileResult Download() 
{ 
    byte[] fileBytes = System.IO.File.ReadAllBytes(@"c:\folder\myfile.ext"); 
    string fileName = "myfile.ext"; 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 

+0

これは元のコードと同じ負の副作用を持つ可能性があります。接続を保持し、再開できません。 – Charlie

+0

私は誤解しているかもしれませんが、彼はそれについて長いことを話していませんでした。ちょうどチャンクでストリームする方法を望んでいました。このコードは何をするのでしょうか。しかし、時間がかかりすぎてタイムアウトして再開できないと心配している場合は、単一のストリームよりもはるかに関わったものが必要です。 –

+0

これはまた、元の提案には別の大きな問題があります。ファイルが4GBを超えると、バイト配列がオーバーフローする可能性があります。 – Charlie

関連する問題