Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ファイルアップロードの相対パス指定

eclipseでJavaと名づけた動的プロジェクトを作成すると、ディレクトリの構造は下記のようになります。

[Java]-[WebContent]-[WEB-INF]

ここにimageフォルダを作成して、そこへjpgファイルをアップロードしたいのですが、何度やっても「指定されたパスが見つかりません」と言う例外がでます。作成したimageフォルダはWEB-INFと同じ階層です。

[Java]-[WebContent]-[WEB-INF]
                    |-[image]

File file("image/java.jpg");
File file("./image/java.jpg");
File file("../image/java.jpg");
File file(request.getContextPath()+"/image/java.jpg")
などなど試しましたが全部例外が出ます。
パスをどのように指定したらimageフォルダにアップロードできるのでしょうか?
よろしくお願い致します。

13

回答

59354

閲覧

13件の回答

評価

0

System.out.println(file.getAbsolutePath());

評価

0

すいません、ちょっと解らないのですがeclipseのWebContentというのは、仮のアプリケーションフォルダという解釈で間違っていないですか?例えばjavaと言うアプリケーションをTomcatに置くとフォルダ構成はwebapps-java-WEB-INFじゃないですか?これをeclipseの動的WEBプロジェクトで作成するとjava-WebContent-WEB-INFと言うフォルダ構成になっているのでjava==WebContentだと思ったのです。なので、WEB-INFと同じ階層にimageフォルダを作成すればアプリケーションルート/image/java.jpgの相対パス指定でOKかと思ったのですがダメでした。eclipseでアプリを完成させたらWebContent配下をTomcatのwebapps-javaに単純にコピーしようと思っていたので相対パス指定をしたかったのです。
imageフォルダへの相対パスを知るためにfile.getAbsolutePathをどのように使用すればいいのでしょうか?よろしくお願いします。

評価

0

$氏が指摘しているのは、
理屈であれこれ考えるのもいいけど、
実際に取得できている値を確認してみろって事。

いうまでもないが、getContextPath()で取得できるのは、絶対パスじゃない。

>imageフォルダへの相対パスを知るために
>file.getAbsolutePathをどのように使用すればいいのでしょうか?

まずは、動作中のWebアプリにおける、
カレントディレクトリの絶対パスを取得しましょう。

「相対的に」指定することにこだわるのは、
まあ、理由は理解できる。
しかしそれは、
一般にに公開されているURLから相対的に、
ではなく、
管理者だけが把握できる、サーバーで取得できる絶対パスを起点として相対的に、
でなければならない。

評価

0

new File(".").getAbsolutePath()
上記でカレントディレクトリのパスを見たら

E:/soft/kaitogo/pleiades-e3.6/eclipse/.

になりました。なんでこんなパスになるのか解りません。eclipseの下にはworkspaceがあってクラスファイルは全然違う場所にあります。何かの設定ファイルでパスを操作しているのでしょうか。実際のアプリのフォルダ構成は

E:/soft/kaitogo/pleiades-e3.6/eclipse/workspace/java/WebContent/WEB-INF

となります。imageフォルダはWEB-INFと同じ階層なので、

E:/soft/kaitogo/pleiades-e3.6/eclipse/workspace/java/WebContent/image

になります。ここからアプリを移動してもだいじょうぶなようにimageフォルダへ相対パスを指定するにはどうすればいいのでしょうか?よろしくお願いします。

評価

0

ServletContext#getRealPath(String)
Tomcat の JSP なら
application.getRealPath("/WEB-INF/image/java.jpg")

評価

0

server.xmlとか、%CATALINA_HOME%\config以下の
設定ファイルの内容を確認してみては。
Contextタグの部分とか。
コンテキストパス.xmlてなファイルが作られてたりもするんじゃないかな。

Tomcat6なんて触ってないので、うっかりするとウソを書きそうだし。f(-.-;

評価

0

> File file("image/java.jpg");
> File file("./image/java.jpg");
> File file("../image/java.jpg");
これは全部相対パス。
実行時ディレクトリに依存する。

> new File(".").getAbsolutePath()
> 上記でカレントディレクトリのパスを見たら

> E:/soft/kaitogo/pleiades-e3.6/eclipse/.
実行時ディレクトリが"E:/soft/kaitogo/pleiades-e3.6/eclipse/"だから。

> 実際のアプリのフォルダ構成は

> E:/soft/kaitogo/pleiades-e3.6/eclipse/workspace/java/WebContent/WEB-INF

> となります。
それは開発しているディレクトリで、eclipseから起動したTomcatが参照しているディレクトリは別のとこだよ。

〜workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Webアプリ名
こんな感じのパスにあるWebアプリをTomcatは参照しているんだけど、
eclipseは、プロジェクトのディレクトリから、この場所にコピーしてくれてます。
その際、ちゃんと、Webアプリ名/WEB-INFって構成になるようにしてくれてます。

で、解決法は仙人さんのいうとおり。

蛇足だけど、この方法、Tomcatでは有効だけど、JBossで、warを展開しない設定にすると駄目じゃなかったっけ?

評価

0

ServletContext.getRealPath(".")

上記でパスを表示させると

E:/soft/kaitogo/pleiades-e3.6/eclipse\workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/java/.

になりました。上記のtmp0/wtpwebapps/java配下にjava/WebContent配下とまったく同じフォルダ構造がありました。そして、アップロードファイルを

ServletContext.getRealPath("image")

のように指定すると、tmp0/wtpwebapps/java/imageに保存されていることが解りました。なんでこんな設定になっているのでしょうか?普通にjava/WebContent/imageに保存させるにはどこの設定をいじればいいのか解りません。
ご存知の方いませんか?
よろしくお願いします。

評価

0

あ!satomiさん。すいません。行き違いになってしまいました。

評価

0

imageの表示は

<img src="./image/java.gif">

です。java/WebConten/imageにjava.gifファイルがあれば表示されます。しかし、実際にはtmp0/wtpwebpps/imageに保存されているので、java.gifは表示されません。

ServletContext.getRealPath("image")

上記の取得先フォルダを

java/WebConten/image

に設定したいのですが、ご存知の方いませんか?
よろしくお願いします。

評価

0

>Tomcatでは有効だけど
Tomcatでもwarを展開しないようにできるので同様かと。


普通はどこか特定の、WEB-INFの下でないディレクトリにアップして、
そこにある画像を取得するサーブレット等を別途作成すると思われ。

評価

0

アップロードしたファイルを、
ServletContext.getRealPath(request.getContextPath() + "/image")
に保存してあげれば
/ContextPath/image/〜
で見れると思うけど。
(ContextPathは、デフォルトではWebアプリケーション名。あなたの言うところのjava)

java/WebConten/image
にしても見れないよ。
java/imageのはず。

動的Webプロジェクトなら、
プロジェクトディレクトリ/build/*
→webapps/Webアプリケーション名/WEB-INF/classes/に展開
プロジェクトディレクトリ/WebContent/*
→webapps/Webアプリケーション名/に展開
ってeclipseが裏でやっている。

なので、
java/WebContent/image
→webapps/java/image
になってるはず
URL直打ちなら、
http://localhost:8080/java/image/java.gif
で見れると思うんだ。

<img src="./image/java.gif">
で表示されないってのは、相対パスが間違ってないかな?
このHTMLを表示したURLが
http://localhost:8080/java/MyServlet
なら
./image/java.gifってのは
http://localhost:8080/java/image/java.gif
になるけど
http://localhost:8080/java/hoge/fuga.jsp
とかだと
http://localhost:8080/java/hoge/image/java.gif
を見に行っちゃうよ?

$さんも書いてるけど、一般的には、Webアプリケーションディレクトリ内に、
動的にファイルを作らないです。

一例としては、前面にapacheを置いて、
/var/www/html/hoge/images/
にアップロードしたファイルを置いて、
<img src="/hoge/images/java.gif"/>
ってしたりします。

評価

0

知識が浅いために、java/WebContent/に執着してしまいましたが、satomiさんが言っていたようにTomcatはjava/WebContenにあるアプリではなく、

E:/soft/kaitogo/pleiades-e3.6/eclipse\workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/java/

にあるアプリを読み込んで実行しているのですね。だとすれば

java/WebConten/imageにアップロードするのではなく、

E:/soft/kaitogo/pleiades-e3.6/eclipse\workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/java/image

にアップロードできればOKだといことですね。
解決です。ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。