web-dev-qa-db-ja.com

「ローカルリソースのロードが許可されていません:file:/// C:.... jpg」Java EE Tomcat

適切なストレージの後にファイルシステムから画像を取得しようとしています(データベースに保存する代わりに、ディスクにコピーし、dbへのパスを配置します)

  1. 写真をc:\ images \フォルダーに保存し、完全なパス名がc:\ images\mypic.jpgであると仮定しました
  2. 取得しようとすると、いくつかのJavaコードを使用してimg src属性を<img src="c:\images\mypic.jps">に設定します
  3. ブラウザコンソールでこのエラーを見つけましたNot allowed to load local resource: file:///C://images//mypic.jpg

質問:これらのパスの問題を修正するには?どこに写真を保存する必要がありますか?そして、どこからそれらを取得する必要がありますか?

40
K.Ariche

タグ<img src="c:\images\mypic.jpg">を送信すると、ユーザーのブラウザは自分のファイルシステムの画像にアクセスします。 c:\imagesにあるフォルダーに画像を保存する必要がある場合、images.jspのようなサーブレットを作成することをお勧めします。パラメーターとしてファイルの名前を取り、サーブレットの応答コンテンツをimage/jpgに設定してからロードしますサーバーの場所からの画像のバイト数と応答に配置します。

しかし、アプリケーションの作成には何を使用しますか?純粋なサーブレットですか?春? JSF?

ここ いくつかの情報、その方法を見つけることができます。

20
T.G

Chromeでは、ランタイムフラグ--allow-file-access-from-filesを使用してこの機能を許可できるはずです。

ただし、Chrome(37、38)の現在のバージョンに問題があるようです。ランタイムフラグ--disable-web-securityも渡さない限り、これは機能しません。

おそらく短期的な回避策を除き、これは受け入れられない解決策ですが、問題として特定されています: https://code.google.com/p/chromium/issues/detail?id=379206 =

11
Roger

多くのブラウザはセキュリティポリシーを変更して、ファイル共有やローカルリソースからも直接データを読み取れないようにしています。 Tomcatインスタンスがファイルを提供できる場所にファイルを配置し、生成するhtmlに「通常の」http URLを配置する必要があります。これは、Tomcatが「静的」コンテンツとしてサービスを提供するディレクトリにファイルを配置するファイルを読み取り、提供するサーブレットを提供することで実現できます。

3
Brett Okken

次の2つの選択肢があります。

1つは、画像の処理にサーブレット内で使用する画像の識別子(画像のパスまたはハッシュ)をパラメーターとして受け取るServletImageLoaderを作成することです。サーバーからの画像。

2つ目は、アプリケーションのROOTフォルダー内にフォルダーを作成し、画像への相対パスを保存することです。

3
Mifmif

このアプリをローカルで実行したいだけで、セキュリティが問題にならない場合の簡単なexpressjsソリューションを次に示します。

server.jsまたはapp.jsファイルに、次を追加します。

app.use('/local-files', express.static('/'));

これにより、/local-filesの下のルートディレクトリ全体が提供されます。言うまでもなく、このアプリをローカルマシン以外の場所に展開することを計画している場合、これは非常に悪い考えです。

これで、次のことが簡単にできます。

<img src="/local-files/images/mypic.jps"/> 

注:macOSを実行しています。Windowsを使用している場合、パス文字列から「C:\」を検索して削除する必要があります

このエラーは、この背後にセキュリティ上の問題があるため、ファイルシステムから直接データをロードできないことを意味します。私が知っている唯一の解決策は、ロードファイルを提供するWebサービスを作成することです。

1
Harun ERGUL

Httpの場所とディスクの場所の概念は異なります。あなたがする必要があるのは:

  1. アップロードされたファイルsummer.jpg
  2. それを既知の(アプリケーションへの)場所の下でディスクに移動します。例:c:\images\summer.jpg
  3. テキストsummer.jpgで画像を表すdbレコードに挿入します
  4. 表示するには、プレーン<img src="images/summer.jpg" />を使用します
  5. アプリケーションのc:\images\の下で/imagesを提供するもの(Apacheなど)が必要です。これができない場合は、ステップ#2でWebルートの下のどこかに保存する必要があります。例:c:\my-applications\demo-app\build\images
1
cherouvim

たとえば、C:/xamp/www/Archivos/images/templatemo_image_02_opt_20160401-1244.jpgのように、イメージの名前を参照するために絶対パスを使用しないでください。 Webサーバー内の場所への参照を使用する必要があります。たとえば、プロセスの実行場所に応じて../../Archivos/images/templatemo_image_02_opt_20160401-1244.jpgを使用します。

0
user6147214