5

これがシナリオです。

リモート ファイル サーバーにファイルがあります (たとえば、DropBox でホストされているファイルがあるとします)。

そのファイルを Web アプリケーション (c# asp.net 4.0) でダウンロードとして提供したい

元のファイルの場所を 100% 隠したい (自分のサーバーから来たように見せたい)。

このファイルをサーバーのメモリまたはディスクに書き込みたくありません。

ストリームを使用してコピーをストリーミングしたいと思っていました。例

Stream inputStream = response.GetResponseStream();
inputStream.CopyTo(Response.OutputStream, 4096);

inputStream.Flush();

Response.Flush();
Response.End();

ただし、これにより、ストリーム全体がメモリにコピーされてから、クライアント ブラウザに書き込まれます。どんなアイデアも素晴らしいでしょう。

サーバーが基本的にプロキシとして機能し、元のファイルの場所を保護する必要があります

助けてくれてありがとう。

4

2 に答える 2

5

次のコードは私が最終的に得たものです(バッファサイズは本番環境で変更されます)これはURLからファイルを取得し、サーバーを介してクライアントにチャンクごとにストリーミングを開始します. 理解するのに少し時間がかかった部分は、各チャンクが書き込まれた後に応答をフラッシュすることでした。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(digitalAsset.FullFilePath);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Response.ClearHeaders();
                Response.ClearContent();
                Response.Clear();
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment;filename=" +     digitalAsset.FileName);

                Stream inputStream = response.GetResponseStream();

                byte[] buffer = new byte[512];
                int read;
                while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    Response.OutputStream.Write(buffer, 0, read);
                    Response.Flush();
                }
                Response.End();
            }

これにより、サーバーが最初にファイルをメモリまたはディスクに保存するのを待たずに、サーバーを介して任意のサイズのファイルをストリーミングできます。本当の利点は、バッファリングされたチャンクのみが保存されるため、メモリをほとんど使用しないことです。クライアントへのダウンロードは即座に開始されます。(これはおそらくほとんどの人にとって明らかですが、この初心者にとっては非常にクールでした)したがって、サーバーを一種のプロキシとして使用して、ある場所からファイルをダウンロードし、別の場所にアップロードすることを同時に行っています。

于 2013-04-08T15:02:47.797 に答える
1

メモリ内のストリーム全体を読み取る理由はわかりませんCopyToが (中間ストリームはどこにもないため)、同じ Copy を手動で記述して、希望どおりに動作することを確認できます。

読み取り/書き込みの非同期バージョンの使用を検討し、C# 4.0のasync/を使用してコードを読み取り可能にすることができるかどうかを検討してください。awit

古い方法: Asynchronous Stream Processing、新しい方法Asynchronous File I/O

于 2013-04-05T20:42:30.877 に答える