- PR -

[ASP.net2.0]画像ファイル直接参照を制御する方法

1
投稿者投稿内容
うこたん
常連さん
会議室デビュー日: 2006/07/14
投稿数: 34
投稿日時: 2008-01-12 10:27
ASP.netでWebアプリを開発しております。

ページにボタンを配置しクライアントのクリックイベントの中で、window.openメソッドを用いて、画像ファイルのURLを指定し表示させようと考えております。
しかし、画像ファイルが格納されているフォルダをIISで設定しているため、ブラウザから直接URLを指定されても開いてしまいます。
画像を表示させるトリガーをボタンクリックのみで、直接参照はアクセス不可にするようなことはできるのでしょうか?

仮想ディレクトリの設定で、画像フォルダの読み取りのアクセス権限を外すとボタンクリック時/直接参照時もエラーになってしまいうまくいかなかったのが現状です。
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-01-12 13:04
IISの設定などの手段でこれを乗り切るのは厳しいと思います。

現実的な実現方法としては、画像を直接公開するのではなく、画像表示用のWebフォームで表示するのが良いのではないでしょうか。

もう少し具体的に書くと、

1) 画像ファイルを直接参照できない場所に配置する(IISで参照権限を外した場所 Or 仮想ディレクトリとは関係無い場所に置く
2) 画像ファイルを読み込み、Response.BinaryWriteするWebフォームを作成する。
3) window.openにて、2)で作ったWebフォームを表示させる

のような形です。


どのような条件で制限するか等の要件にもよりますが、こういった要件の対応には、この形を基本とし、2)のWebフォーム内でログイン状態/アクセス元/リファラ/パラメータ等をうまく使って画像の出力を制御するのが一般的なのではないかと思います。
#私が勝手に一般的と思っているだけかもしれませんが。
うこたん
常連さん
会議室デビュー日: 2006/07/14
投稿数: 34
投稿日時: 2008-01-12 14:15
引用:

kiyokuraさんの書き込み (2008-01-12 13:04) より:

1) 画像ファイルを直接参照できない場所に配置する(IISで参照権限を外した場所 Or 仮想ディレクトリとは関係無い場所に置く
2) 画像ファイルを読み込み、Response.BinaryWriteするWebフォームを作成する。
3) window.openにて、2)で作ったWebフォームを表示させる




具体的な実現方法ありがとうございます。
下記のソースで画像表示まで行うことができました。

Dim byBuff() As Byte
byBuff = My.Computer.FileSystem.ReadAllBytes("test.jpg")
Response.ContentType = "image/jpeg"
Response.BinaryWrite(byBuff)
Response.End()

この件に関しては、あとはアクセス権限を対応するだけです。

加えてお聞きしたいのですが、上記のソースだと1枚の画像しか出力できませんが、複数の画像ファイルを読み込んで、テーブルコントロールのセルに読み込んだ分だけ画像を表示させるようなことはResponse.BinaryWriteを用いて可能なのでしょうか?
kiyokura
ベテラン
会議室デビュー日: 2007/08/08
投稿数: 69
お住まい・勤務地: 岡山
投稿日時: 2008-01-12 14:55
引用:

うこたんさんの書き込み (2008-01-12 14:15) より:

加えてお聞きしたいのですが、上記のソースだと1枚の画像しか出力できませんが、複数の画像ファイルを読み込んで、テーブルコントロールのセルに読み込んだ分だけ画像を表示させるようなことはResponse.BinaryWriteを用いて可能なのでしょうか?



Response.BinaryWriteで画像のバイナリを返すということは、一枚の画像ファイルをブラウザに送りつけるだけですので、『ひとつのWebフォーム(aspx)でHTMLも出力しつつ、そこに画像を埋め込んで返す』というのは無理があると思います。

ですので、やるとしたら以下のような感じでしょうか。

1) 新規にWebフォームを一つ用意する。
  Webフォームの中身は、以下のような感じ。
   ・テーブルコントロールを配置
   ・セルにimgタグ等、画像を表示するためのコントロールを配置
   ・上記画像表示用コントロールのソースとして、
    前述のResponse.BinaryWriteで画像を返すWebフォームを指定
2) windows.openで上記のWebフォームを表示


同じサイズの画像を並べて表示するなら、『画像ファイルを読み込み、内部で加工して(くっつけて)一枚の画像として出力する』みたいな方法もアリかも知れません。
が、サイズが統一されてなかったり、単純にくっつけて表示するのでなかったりするならば、加工(とその仕様の検討)が面倒そうなので、たぶん私はできる限り前述の方法でやろうとする……と思います。
#あんまりでかい一枚絵というのも、(今となって心理的なものかも知れませんが)抵抗があります。
うこたん
常連さん
会議室デビュー日: 2006/07/14
投稿数: 34
投稿日時: 2008-01-12 23:53
ご回答有難うございます。

詳細な情報のおかげで、なんとか実現できそうです。
知識不足を痛感しました。これからも日々勉強していきたいと思います。
また何かありましたらよろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)