C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[14]: 画像を置くフォルダーについて


(過去ログ 129 を表示中)

[トピック内 18 記事 (1 - 18 表示)]  << 0 >>

■76701 / inTopicNo.1)  画像を置くフォルダーについて
  
□投稿者/ まこと (4回)-(2015/08/05(Wed) 08:29:42)

分類:[ASP.NET (C#)] 

ASP(サーバーサイドのプログラミング)の素人です。

ユーザーがパスワードでログインして、画像をUPロード、DOWNロードする
ASP.NET(C#)のプログラムを書いています。
ここで画像を置くサーバーのフォルダーに関してお聞きします。
画像はWEBで一般の人には公開したくない、あくまででパスワードでログイン
した人が、ASPの画面からだけアクセスするようにしたいのですが、何か
良い方法が有るでしょうか。

引用返信 編集キー/
■76702 / inTopicNo.2)  Re[1]: 画像を置くフォルダーについて
□投稿者/ 魔界の仮面弁士 (433回)-(2015/08/05(Wed) 09:35:33)
No76701 (まこと さん) に返信
> あくまででパスワードでログインした人が、
> ASPの画面からだけアクセスするようにしたいのですが、
> 何か良い方法が有るでしょうか。

画像バイナリを、サーバー上の非公開フォルダまたはデータベースのBLOB等に保存しておき、
それを Response.WriteFile なり Response.BinaryWrite なりで送出すれば良いかと。
http://www.atmarkit.co.jp/ait/articles/0207/18/news001_3.html


なお ASP という表記は、旧い技術である Active Server Pages を連想させますので、
ASP.NET という表記を用いた方が良いと思いますよ。
引用返信 編集キー/
■76707 / inTopicNo.3)  Re[2]: 画像を置くフォルダーについて
□投稿者/ まこと (5回)-(2015/08/05(Wed) 11:02:47)
No76702 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士さん早速の回答ありがとうございます。
ASPの表記は気を付けたいと思います。

ちょっと説明不足でした。
パスワードでログインしたユーザーが、画面のリストに表示してある
人物(person)名を選択すると、選択された人物のテキスト情報と画像データが
表示されるというもので、画像データはASP.NETのImageコントロール
に表示されます。
(実際はImage.ImageUrlにイメージファイルのURLをセットしている)
ユーザーは新しく人物を登録することも可能としたい。
(ユーザーが画像をアップロードすることもある)
コードは殆ど完成しているのですが、画像がパスワードに無関係に
Webで見えてしまうと言う問題が有ります。
(どのような問題になるかは別として)

通常画像をWebに公開されないフォルダーに入れて置いて、
画像を表示する時に、Image.ImageUrlにリンク出来るフォルダーに
一時的にコピーし、クライアントの接続が終了した時点で消去
するという方法も考えましたが、速度的な問題もあるので、
何か良い方法が無いか質問しました。

引用返信 編集キー/
■76708 / inTopicNo.4)  Re[1]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (637回)-(2015/08/05(Wed) 11:06:10)
No76701 (まこと さん) に返信

何を作っているのかとご自分の環境を最初に書いていただけませんか?

分類から ASP.NET らしいのは分かりますが、Web Forms なのか MVC なの
かは分かりません。

環境というのは、OS, .NET, IIS, Visual Studio のバージョン、認証方式、
DB サーバーとそのバージョン、ブラウザを使っているなら何かなどに関す
る情報です。

適切に情報が提供されていれば、回答者が質問者さんの状況を的確に把握
でき、タイムリーで的を得た回答が得られるということで、質問者さんに
もメリットがあります。

・・・と注文をつけるばかりでは何ですので、ASP.NET Web Forms アプリ、
フォーム認証、IIS7 以降の統合パイプラインモードで運用すると想像して
回答します。

多分、一部のページには匿名アクセスを許可するが、画像は許可しない(ロ
グイン済みユーザーのみアクセス可)にしたいのだと思いますが、そうであ
れば画像ファイルは専用のフォルダに入れて、そのフォルダに web.config
を追加して匿名ユーザーのアクセスを拒否するようにすればいいです。

具体的には以下の記事が参考になると思います。

Apply ASP.NET Authentication and Authorization Rules to
Static Content with IIS 7.0's Integrated Pipeline Feature
http://aspnet.4guysfromrolla.com/articles/122408-1.aspx

上の記事の最後の方に書いてある既存の FormsAuthenticationModule の
UrlAuthorization modules 除去と再設定は ASP.NET4 では不要だったと記憶
しています。(ちょっと自信がないですが)


#DB に格納すれば、そこから直接ユーザーが画像データを取得することは
実質的にできなくなりますが、取得するための HTTP ハンドラを自作しなけ
ればなりません。また、その HTTP ハンドラに匿名アクセスできれば、結局
画像にはアクセスされてしまいます。

引用返信 編集キー/
■76710 / inTopicNo.5)  Re[3]: 画像を置くフォルダーについて
□投稿者/ 魔界の仮面弁士 (434回)-(2015/08/05(Wed) 11:25:54)
2015/08/05(Wed) 11:29:30 編集(投稿者)

No76707 (まこと さん) に返信
> (実際はImage.ImageUrlにイメージファイルのURLをセットしている)
先の回答は、その URL を /foo/bar.jpg にするのではなく、
/foo/bar.aspx?param=1234 などにし、その bar.aspx が、
画像のバイナリを返却するようにしておく、ということです。

そうすれば、セッション情報を元にして、ログイン認証も行えますよね。

下記は VB の例ですが、参考になれば。
http://d.hatena.ne.jp/akabeina/20130223/1361629083
引用返信 編集キー/
■76714 / inTopicNo.6)  Re[2]: 画像を置くフォルダーについて
□投稿者/ まこと (6回)-(2015/08/05(Wed) 13:59:26)
WebSurferさん ありがとうございます。
サーバー
プログラム言語 ASP.NET 2.0/3.5/4.0/4.5
SQL Server 2008(IIS 7.0)
後は不明

開発環境
Windows 7 (IIS 7.5)
Visual Studio 2010 Ultimate
Microsoft .NET Framework Version 4.5.50938
ブラウザ Google Chrome 44.0 or IE11
データ保存はXMLファイルを使用、「App Data」に保存
画像データはwwwroot直下のimagexxフォルダーに保存
認証方式は独自で作成(アカウントにより認証ページから遷移する
ページが異なる為)
Web Formsを使用

「Integrated Pipeline」と言うのはちょっと自信無いですが、
後学の為に試してみます。

魔界の仮面弁士さん
おお!
ファイル名の代わりにファイルを書き出さすクラスを設定するんですか。
こんな芸当ができるんですね。
聞いて良かった。

解決済み
引用返信 編集キー/
■76715 / inTopicNo.7)  Re[3]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (638回)-(2015/08/05(Wed) 14:39:04)
No76714 (まこと さん) に返信

> 後学の為に試してみます。

試しても「認証方式は独自で作成」ということなので、紹介した記事の通
りにやっても多分ダメだと思います。

その、独自認証方式を拡張して、「wwwroot直下のimagexxフォルダー」に
アクセス制限をかけるほか方法はなさそうな気がします。
解決済み
引用返信 編集キー/
■76719 / inTopicNo.8)  Re[4]: 画像を置くフォルダーについて
□投稿者/ なちゃ (60回)-(2015/08/05(Wed) 19:26:29)
独自の認証というのは具体的にはどんなやり方でしょうか?
※ページリクエスト時に、どのような制御が行われているか、という観点です。

その認証がページか画像かなどに関係なく動作できる仕組みなら、単純に画像にも認証を有効にしてしまうだけですむ可能性が高いです。
※やり方的にはWebSurferさんが紹介してる方法

独自の認証が、ページにしかうまく動かせられないとかの仕組みであれば、魔界の仮面弁士さんが書かれているようなやり方が簡単でしょう。
作りにもよりますがたいていの場合だいたいそのまま動くでしょう。
引用返信 編集キー/
■76720 / inTopicNo.9)  Re[5]: 画像を置くフォルダーについて
□投稿者/ hata (14回)-(2015/08/05(Wed) 22:00:30)
WebSurferさん
回答いは少し時間をいただきます。
レンタルサーバーのアクセス制限でちょっとトラぶってます。

なちゃさん
ありがとうございます。
独自の認証は大したことをしていません。
入力されたユーザー名とパスワードをあらかじめ登録された
データと照合して登録情報と合致していたら、次のページに
進みます。

とりあえず画像フォルダーをApp Dataフォルダに置いて、
魔界の仮面弁士さんご教授の方法で試してみます。

引用返信 編集キー/
■76721 / inTopicNo.10)  Re[6]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (639回)-(2015/08/05(Wed) 22:22:50)
No76720 (hata さん) に返信
> WebSurferさん
> 回答いは少し時間をいただきます。
> レンタルサーバーのアクセス制限でちょっとトラぶってます。

まことさん = hata さんですか?
引用返信 編集キー/
■76722 / inTopicNo.11)  Re[7]: 画像を置くフォルダーについて
□投稿者/ まこと (7回)-(2015/08/06(Thu) 06:05:21)
違うと言えば違い、そうだといえばそうです。
まことは私の同僚で女性です。
私に質問されたのですが専門外で、
掲示版で聞いてみたらと言ったところ、
掲示版って何ですか?
と言うので、こう言う風と代わって私が
質問しました。
そのついでに、ほかのレスを。
止めておけばと後悔してます。

引用返信 編集キー/
■76724 / inTopicNo.12)  Re[8]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (640回)-(2015/08/06(Thu) 09:59:49)
■ (まこと さん) に返信
> 違うと言えば違い、そうだといえばそうです。
> まことは私の同僚で女性です。

と言うことは hata さんが「同僚で女性」(女性というのは関係ないと思いますが)
のまことさんの ID を使って書き込んだと言うことですか? No76722 も hata さん
がまことさんに成り代わって書いている?

どのような事情があるにせよ、そういうのは止めていただけませんか。

hata さんご自身がそういうのはこの掲示板の規約違反だと書き込んだ記事をどこか
で見たような気がしますが・・・

それとも、それは別の hata さんですか?
引用返信 編集キー/
■76725 / inTopicNo.13)  Re[9]: 画像を置くフォルダーについて
□投稿者/ まこと (8回)-(2015/08/06(Thu) 10:06:53)
No76724 (WebSurfer さん) に返信
hataで書き込んだのは操作ミスでした。
申し訳ない。

引用返信 編集キー/
■76733 / inTopicNo.14)  Re[10]: 画像を置くフォルダーについて
□投稿者/ まこと (9回)-(2015/08/07(Fri) 10:41:28)
hata 代理投稿
魔界の仮面弁士さんご教示の方法でImageファイルの隠蔽に
成功しました。
いつもながら適切な回答ありがとうございました。

イメージフォルダーは、WWWの下のApp_Dataに置いてあります。
以下 c#のコードです。

public partial class getImage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //引数の取得
        string imageName = Page.Request.QueryString.Get("imgName");
        //拡張子の取得
        string ext = Path.GetExtension(imageName);
        //ContentTypeの取得
        if (ext.ToLower() == ".jpeg" || ext.ToLower() == ".jpg")
            Response.ContentType = "image/jpeg";
        else if (ext.ToLower() == ".png")
            Response.ContentType = "image/png";
        else if (ext.ToLower() == ".gif")
            Response.ContentType = "image/gif";
        
        //イメージフォルダーは固定
        string imagePath =  Server.MapPath(".") + "/App_Data/image01/";
        Response.Flush();
        Response.WriteFile(imagePath + imageName );
        Response.End();
    }
}

  string imgName = "hoge.jpg"; 
  Image1.ImageUrl = "getImage.aspx?imgName=" + imgName;

解決済み
引用返信 編集キー/
■76742 / inTopicNo.15)  Re[11]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (641回)-(2015/08/08(Sat) 12:05:12)
質問者さんには余計なお世話かもしれませんが、ここを訪れる一般閲覧者
の方の参考になるかもしれないので書いておきます。

(1) App_Code に画像ファイルを置くと、直接ブラウザのアドレスバーに
  画像ファイルのパスを入力してもアクセスできなくなりますが、.aspx
  を介してダウンロードできるようにすれば、.aspx にアクセス制限
  しない限り画像はダウンロードできてしまいます。

(2) .aspx ページで Flush, End メソッドは使用しない方がよさそうです。
  理由は、

  (a) Flush を使うと chunked コーディングされる。(意図的にそうす
    るのであれば話は別ですが、そうではないですよね)

  (b) End メソッドの使用は非推奨になっている。(.NET 4 以降の MSDN
    ライブラリの説明に明記されています)

(3) 画像など、Page でないコンテンツをダウンロードするには、.aspx
  を利用するより、HTTP ハンドラ(.ashx)を利用したほうが良い。
  理由は、

  (a) End メソッドを使用する必要がなくなる。

  (b) .aspx より軽い。

  詳しくは以下の記事を見てください。

  ダウンロードは HTTP ハンドラで
  http://surferonwww.info/BlogEngine/post/2013/02/16/use-http-handler-for-downloading-files.aspx


あと、HTTP ハンドラ(もしくは .aspx)を使うなら、キャッシュコント
ロールが自由に設定できるのだから、その機能を使ったほうがいいと思
います。

上の記事のコードでも HttpResponse.Cache を使ってキャッシュさせな
い場合の例が書かれていますが、もちろん逆にキャッシュの有効期限を
設定することもできます。

さらに、ETag, Last-Modified を設定すれば、ブラウザが再度画像を要
求する際に If-Modified-Since と If-None-Match を要求ヘッダに含め
て送ってくれますので、それを見て条件を満たせば HTTP 304 Not
Modified 応答を返すということも可能です。

興味がありましたら、具体例が以下の記事にありますので見てください。

HTTP ハンドラでキャッシュコントロール
http://surferonwww.info/BlogEngine/post/2015/05/19/cache-control-by-using-http-handler.aspx
引用返信 編集キー/
■76743 / inTopicNo.16)  Re[12]: 画像を置くフォルダーについて
□投稿者/ WebSurfer (642回)-(2015/08/08(Sat) 12:06:16)
解決済みマークを付け忘れました。
解決済み
引用返信 編集キー/
■76744 / inTopicNo.17)  Re[13]: 画像を置くフォルダーについて
□投稿者/ ま (1回)-(2015/08/08(Sat) 18:06:41)
2015/08/08(Sat) 18:09:47 編集(投稿者)

間違って投稿しました。
再投稿します。

解決済み
引用返信 編集キー/
■76745 / inTopicNo.18)  Re[14]: 画像を置くフォルダーについて
□投稿者/ まこと (10回)-(2015/08/08(Sat) 18:12:37)
No76744 (WebSurfer) に返信

hata 代理投稿

WebSurferさん
おっしゃる通りでした。
ImageのURLをブラウザに貼り付けたら画像が見えてしまいました。

もともと画像表示画面は認証画面を経由してくる設定に
なっていますので、Session変数を使い、認証画面を
経由しないアクセスはgetImageクラスで全てdenyする
ように変えました。

(2)、(3)に関しましては知識が少なくおぼろげにしか
理解できません。
じっくり読ませていただきます。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -