3

ローカル ディスク C: に保存されている画像を表示する必要がある ASP ページがあり、場合によってはネットワーク ドライブからのパスの例:--C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg I C#コードビハインドで次のコードを実行しました

Image image = new Image();
image.Height = 150;
image.Width = 150;
string path = @"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg";//this path will come from database dynamically this is for test only
image.ImageUrl = path;
this.Controls.Add(image);

しかし、画像が表示されないので、このSOの質問 に出くわし、以下のようにコードを更新しました

画像を表示しているページの

        Image image = new Image();
        image.Height = 150;
        image.Width = 150;
        string path = @"C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg";
        image.ImageUrl = "ImageWriter.aspx?path=" + path;
        this.Controls.Add(image);

およびプロキシページ用

        Response.ContentType = "image/jpeg"; // for JPEG file
        string physicalFileName = Request.QueryString["path"];
        Response.WriteFile(physicalFileName);

これは正常に機能していますが、2つの質問があります

 1) Why the file is accessible from the physical path while proxy from page but other page cannot able to access it ? 
 2) And is there any other way to do it ?

どんな助けでも大歓迎です。

4

3 に答える 3

3

そのパスには、おそらく別の PC とネットワーク上にあるブラウザーを介した asp.net サイト ユーザーへの相対的なコンテキストがないため、画像は利用できません。これを修正するには、サーバーのローカル ドライブまたはネットワーク上にある画像を取得し、それらを画像としてブラウザーに提供する ASHX ハンドラー ページを作成するだけです。

    public void ProcessRequest(HttpContext context)
    {
        string imgName = context.Request.QueryString["n"];
        context.Response.ContentType = "image/png";
        string path = @"C:\Users\Public\Pictures\Sample Pictures\" + imgName;
        Image image = Image.FromFile(path);
        image.Save(context.Response.OutputStream, ImageFormat.Png);
    }

次に、ASP で画像の URL を ashx に指定するだけです。

    image.src = "images.ashx?n=penguin.jpg";
于 2013-10-09T13:19:26.693 に答える
2

私の経験では、最終的に上記の解決策を不可能にするすべてのセキュリティ問題を回避する最善の方法は、ローカル Web サイトをセットアップし、次のように画像 URL を設定することです: image1.ImageUrl="http://pcname/photofolder/ myphoto1.png". pcname はローカル Web サーバーの名前で、path はローカル IIS に設定された仮想ディレクトリのパスです。ローカル IIS のセットアップは非常に簡単です。Google にはたくさんのヒントがあり、仮想ディレクトリをセットアップするには、iis に入り、デフォルトの Web サイトを開き、[新しい仮想ディレクトリを追加] を右クリックして名前を設定するだけです (私の例ではフォトフォルダー) を物理的なローカル ディスク フォルダーを指すようにすると、トリックは完了です。これには利点もあります。つまり、LAN に接続されているすべてのクライアントでそのフォルダーにアクセスできるということです。

于 2016-12-30T20:49:43.933 に答える
2

1) プロキシ ページは物理パスにアクセスできるのに、他のページはアクセスできないのはなぜですか?

他のページはできます。ただし、他のページファイルにアクセスしていません。クライアント(Web ブラウザー) がアクセスできるように、ファイルのパスを HTML 出力に設定するだけです。この結果:

<img src = "C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg" />

ユーザーはそのファイルにアクセスできないため、imgタグは機能しません。「プロキシ」ページの目的は、ユーザーがアクセスできる場所 (プロキシ ページ) からファイルのコンテンツを提供することです。

2) それを行う他の方法はありますか?

いいえ。ユーザーが Web サーバー上の何らかの仮想パスを介してファイルに直接アクセスする必要があるか、ファイルの内容を読み取ってユーザーに送信するプロキシが必要です。C# コードとはほとんど関係がなく、Web サーバー上でユーザーが表示できるものとすべてが関係しています。ファイルが Web アクセス可能なフォルダーにない限り、ユーザーはファイルを見ることができません。

これは、Web アプリケーションの背後にあるファイルを保護するための非常に一般的で標準的なアプローチです。たとえば、ユーザーにファイルの表示を許可する前に、ユーザーの権限を確認したい場合があります。ファイルが公開されている場合は、直接アクセスできます。ただし、ユーザーとファイルの間にプロキシ ページがある場合、そのページは承認を強制できます。

于 2013-10-09T13:06:47.900 に答える