プロが教えるわが家の防犯対策術!

アップロードした画像の格納先について

お世話になります。
ユーザが画像をアップロードして、それを表示するプログラムを作成しています。
ただ、画像をどういうディレクトリに格納すればいいのか困っています。
現在は、例えば「test」というアプリケーションだとすると

test
+-images

というディレクトリ構成で、imagesディレクトリに格納するようにしています。
ですが、このtestというアプリケーション(test.war)をデプロイすると、imagesの中のデータが全て削除されてしまいます。おそらくは test.warがサーバー上で展開されるときに上書きされてしまうのではないかと思っていますが。
 そこで質問なのですが、
・このような場合に、test配下のディレクトリを画像の格納先にすることは正しい(一般的な)方法なのか
 ・もしそうだとしたら、デプロイ時に画像が削除されない方法はあるのか
 ・もしtest配下以外のディレクトリに格納するのが正しい場合は、htmlのimgタグでどのように画像へのパスを記述すればいいのか
・あるいは全く別の方法があるのか

を知りたいと思っています。
 Servlet,JSPを使っていまして、開発環境はTomcat5.5(Windows)です。ただ、本番環境はまだ決まっていないので、特定の AppServer、OSに依存しない方法を知りたいです。
 よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

> Tomcat5.5で設定をしようとしているのですが、うまくいきません。


> server.xmlの中に下記を加えて再起動しました。
> <Server>
> (中略)
> <Context path="/test/images" docBase="C:\var\test\images"/>
> </Server>
> これで、C:\var\test\imagesにsup.jpgというファイルを置けば、
> http://localhost/test/images/sup.jpg

http://localhost/
なの?
http://localhost:8080/
とかじゃないのね?

私はservlet.xmlを編集はしたことないので私のやり方で説明するわ。

CATALINA_HOME\conf\Catalina\localhost\test#images.xml
を作ってファイルの中身は
<Context path="/test/images" reloadable="true" docBase="C:\var\test\images">
</Context>
こんな感じかしら。
    • good
    • 0
この回答へのお礼

ありがとうございました。できました!

お礼日時:2010/05/09 20:00

HTTPServerの設定に依存するわ。



たいていのサーバは
http://ドメイン/アプリ/images
というパスを好きなディレクトリに設定することができるわ。
逆に言うとそれができないサーバは選択肢に入れないべきね。
できないものを知らないけど。
    • good
    • 0
この回答へのお礼

ありがとうございます。
つまり、仮想ディレクトリを設定すればいい、ということでしょうか。
勉強になりました。

で、Tomcat5.5で設定をしようとしているのですが、うまくいきません。
server.xmlの中に下記を加えて再起動しました。

<Server>
(中略)
<Context path="/test/images" docBase="C:\var\test\images"/>
</Server>

これで、C:\var\test\imagesにsup.jpgというファイルを置けば、

http://localhost/test/images/sup.jpg

で画像が表示されるはずだと考えていたのですが、404が出ます。
 どこか他にも設定するところがあるでしょうか? それともこの設定が悪いでしょうか。

お礼日時:2010/05/06 16:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qwebアプリケーションでの画像ファイルの保存場所

お世話になります。

Javaと、MySQLでウェブアプリケーションを作成していまして、ユーザーがアップロードしたファイルを
どこのディレクトリに保存すればいいか悩んでいますので、教えてください。

ユーザーがログインし、自分のアイコンを設定した場合、
その画像ファイル(jpgなど)はどのフォルダに置いておけばいいのでしょうか?

例えば、imgフォルダにおいた場合、バージョンアップしたプログラムをデプロイすると、
サーバー内のimgフォルダ内のデータはなくなってしまうと思いますので、ユーザーがアップした画像などは
そこに置いてはいけないと思います(バージョン・アップ時に消えてしまいますので)。

「デプロイしても消されない場所に置けばいい」ということでしょうか?

皆さんはどうされていますでしょうか?

よろしくお願い致します。。

Aベストアンサー

こんにちは。

検索すればいろんなサンプルが出てくると思いますよ。

すごく簡単に書くとしたら

// 画像ファイルのパス
File file = new File ( "/home/・・・・" );
response.setHeader ( "Content-Type", "image/jpeg" );
response.setContentLength ( (int)file.length() );
// 出力と入力
ServletOutputStream out = response.getOutputStream();
BufferedInputStream in = new BufferedInputStream ( new FileInputStream(file) );

int data = 0;

while ( (data = in.read()) != -1 ) {
// 書き出す
out.write(data);
}
in.close();
out.close();

これをサーブレットなりで呼び出してあげれば、任意の場所の画像ファイルを出力します。
(実際の運用ではパラメータでID等を渡してDBからファイル名を取得する)

これを応用すると、必ずサーブレットなりを介さないとファイルには直接アクセスできないため、
認証をさせたり、ダウンロード数を把握したり、期限を設定したりいろいろ出来るようになります。

こんにちは。

検索すればいろんなサンプルが出てくると思いますよ。

すごく簡単に書くとしたら

// 画像ファイルのパス
File file = new File ( "/home/・・・・" );
response.setHeader ( "Content-Type", "image/jpeg" );
response.setContentLength ( (int)file.length() );
// 出力と入力
ServletOutputStream out = response.getOutputStream();
BufferedInputStream in = new BufferedInputStream ( new FileInputStream(file) );

int data = 0;

while ( (data = in.read()) != -1 ) {
// 書き出す
out....続きを読む

QJSPでの画像ファイル表示

<img src="~.gif">とすれば、決められた画像は表示できるのですが、"~.gif"の部分に変数を使用して、場合に応じて、ファイル名(数字)が違う画像ファイルを読み込ませたいのです。
その場合当然なのですが、<img src="~" + <% 変数 %> + ".gif">としても、できないんですよね。

何か方法をご存知の方教えてください。よろしくお願いします。

Aベストアンサー

<img src="~ <%= 変数 %>.gif">
じゃないですか?

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

Qファイルのパスの取得について

いつも参考にさせて頂いています。
掲示板をファイル操作にて作成しようと思っています。
初歩的な質問かもしれませんが宜しくお願いします。

フォルダ構成が下記の場合、「confフォルダのtest.txt」を読み込む際のパスはどのように取得もしくは指定すれば良いでしょうか?

プロジェクトフォルダ
 |
 |----JavaSource ←.javaファイルを格納
 |----WebContent
     |----css
     |----js
     |----WEB-INF
         |----conf ←このフォルダ内のtest.txt
         |----jsp
         |----lib

ファイルの読み込みはBufferedReaderクラスを使うと効率よく読み込めるとネットで記述があったのでそれを使おうと思ってます。

BufferedReader br = new BuffferedReader(new FileReader("test.txt") );

みたいな感じで読み取れると思ってますが合ってますでしょうか?
("test.txt"の箇所に取得した(絶対又は相対)パスが入ると思ってます。)
以上宜しくお願いします。

いつも参考にさせて頂いています。
掲示板をファイル操作にて作成しようと思っています。
初歩的な質問かもしれませんが宜しくお願いします。

フォルダ構成が下記の場合、「confフォルダのtest.txt」を読み込む際のパスはどのように取得もしくは指定すれば良いでしょうか?

プロジェクトフォルダ
 |
 |----JavaSource ←.javaファイルを格納
 |----WebContent
     |----css
     |----js
     |----WEB-INF
         |----conf ←このフォルダ内のtest.txt
     ...続きを読む

Aベストアンサー

ファイルのパスの取得方法がわからない、ということでしょうか?

String path = application.getRealPath("WEB-INF/conf/test.txt");

JSPなら、こんな感じで、test.txtの絶対パスが取得できます。後は、それを元にストリームを作成すればよいかと。サーブレットなら、ServletContext application = this.getServletContext();などで取得して同様に行えばいいでしょう。

QEclipseから実行すると画像が読み込まれない

下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。

コードが同じなのに不思議です…。

原因はどんなことが考えられるのでしょうか?

class test extends JFrame{
public static void main(String args[]){
test frame = new test("タイトル");
frame.setVisible(true);
}

test(String title){
setTitle(title);
setBounds(100, 100, 500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel p = new JPanel();

ImageIcon icon1 = new ImageIcon("img.jpg");
JLabel label1 = new JLabel(icon1);

p.add(label1);

Container contentPane = getContentPane();
contentPane.add(p, BorderLayout.CENTER);
}
}

下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。

コードが同じなのに不思議です…。

原因はどんなことが考えられるのでしょうか?

class test extends JFrame{
public static void main(String args[]){
test frame = new test("タイトル");
frame.setVisible(true);
}

test(String title){
setTitle(title);
setBounds(100, 100, 500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_C...続きを読む

Aベストアンサー

パスが違ってるんだと思いますよー。
Eclipseは、プロジェクトを実行すると、作業ディレクトリのパスをワークスペースに設定しますよー。だから、ワークスペースのフォルダの中にファイルがないと読めませんよー。

実行構成のメニューを選んで、Javaアプリケーションの実行構成で、「引数」タブの作業ディレクトリのところを、そのファイルがある場所(たぶん、プロジェクト?)に変更して実行すれば、ちゃんと読めるはずですよー。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

Qformでテキストとファイルタイプの同時受け渡し

以下の質問の続きなのですが、JAVAカテゴリを勧められましたのでこちらで質問させてください。
http://bekkoame.okwave.jp/question/selectbestanswer?aid=18429563&qid=6529772

使用言語はJSPです。

「送信ボタンが押下されたとき、同じ遷移先の画面に「テキスト」「ファイル」タイプのデータを同時に受け渡せないことがわかりました。

(1)
<form action="al.jsp" method="POST">
⇒<input type="radio" name="1" value="2">の受け渡しが可能

(2)
<form action="a.jsp" enctype="multipart/form-data" method="POST">
⇒<input type="file" name="uploadfile" size="50">の受け渡しが可能

送信ボタン押下時に(1)テキスト(2)ファイルデータを同時に受け渡し、
a.jspからrequest.getParameter("1");
で値を取得する方法を教えて頂けないでしょうか。

現在は、
<form action ~>
(1)input
(2)input
</form>
の形式になっています。

以下の質問の続きなのですが、JAVAカテゴリを勧められましたのでこちらで質問させてください。
http://bekkoame.okwave.jp/question/selectbestanswer?aid=18429563&qid=6529772

使用言語はJSPです。

「送信ボタンが押下されたとき、同じ遷移先の画面に「テキスト」「ファイル」タイプのデータを同時に受け渡せないことがわかりました。

(1)
<form action="al.jsp" method="POST">
⇒<input type="radio" name="1" value="2">の受け渡しが可能

(2)
<form action="a.jsp" enctype="multipart/form-data" meth...続きを読む

Aベストアンサー

こんな感じでしょうか。
送られてきたformの名称と値を出力しています。

--全角でインデントしています
if (ServletFileUpload.isMultipartContent(request)) {
 ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
 try {
  List items = upload.parseRequest(request);
  for (Iterator ite = items.iterator(); ite.hasNext(); ) {
   FileItem item = (FileItem) ite.next();
   if (item.isFormField()) {
    //getString()の引数はご自身の環境に合わせて設定してください。
    System.out.println(item.getFieldName() + ":" + item.getString("UTF-8"));
   }
  }
 } catch (FileUploadException e) {
  e.printStackTrace();
 }
}

Commons IOのライブラリも必要ですのでご注意を。
例外処理などなにも考慮していないので、あくまで参考程度にしてください。

こんな感じでしょうか。
送られてきたformの名称と値を出力しています。

--全角でインデントしています
if (ServletFileUpload.isMultipartContent(request)) {
 ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
 try {
  List items = upload.parseRequest(request);
  for (Iterator ite = items.iterator(); ite.hasNext(); ) {
   FileItem item = (FileItem) ite.next();
   if (item.isFormField()) {
    //getString()の引数はご自身の環境に合わせて設...続きを読む

QonClickに複数の関数を挿入する方法

初心者なのですがアニメーションの関数anime1、anime2、anime3を作成し、onClickに下記のように設定しました。
クリックするとアニメーション2つの設定ではは動くのですが、3つ目を設定すると動かなくなります。
通常はこのような設定はしないものなのでしょうか?
教えてください。
よろしくお願いします。
<INPUT type="button" value="START" onClick="anime1(), anime2()">・・・OKです。
<INPUT type="button" value="START" onClick="anime1(), anime2(),anime3()">・・・動きません。

Aベストアンサー

セミコロンでつなぐのが常道ですが、3つ以上なら
別途function化したほうが、可読性が高くなると
思います。

Qラジオボタンの選択肢をサーブレットで取得するには?

サーブレットの開発を行っていますが、ブラウザー側で
ラジオボタンを選択した際に何を選択したかのデータを取得したいのです。
(下記のHTMLで言えば、割引手形か、手形貸付か、証書貸付というのを取得したいのです)
パラメーターをサーブレットで受け取りたいのですが
うまくいきません
HTMLでHIDDENを使用するとか聞いたことはあるのですがどのようにコーディングすればいいんでしょうか?
よろしくお願いいたします。

<p>
<input type="radio" name="radiobutton" value="radiobutton">
割引手形 
<input type="radio" name="radiobutton" value="radiobutton">
手形貸付 
<input type="radio" name="radiobutton" value="radiobutton">
証書貸付
</p>

ブラウザー側からは
<form action="http://localhost/servlet/yuushi" method=post>
の指定を行っています。
サーブレットでの受け取り方を、
String p2=request.getParameter("radiobutton");
 とすると、p2=radiobuttonとデータがセットされました。

サーブレットの開発を行っていますが、ブラウザー側で
ラジオボタンを選択した際に何を選択したかのデータを取得したいのです。
(下記のHTMLで言えば、割引手形か、手形貸付か、証書貸付というのを取得したいのです)
パラメーターをサーブレットで受け取りたいのですが
うまくいきません
HTMLでHIDDENを使用するとか聞いたことはあるのですがどのようにコーディングすればいいんでしょうか?
よろしくお願いいたします。

<p>
<input type="radio" name="radiobutton" value="...続きを読む

Aベストアンサー

それぞれの項目の value を、ユニークにして下さい。例えば、

<input type="radio" name="radiobutton" value="1"> 割引手形 
<input type="radio" name="radiobutton" value="2"> 手形貸付 
<input type="radio" name="radiobutton" value="3"> 証書貸付

そうすれば、「手形貸付」を選択したときに

String p2 = request.getParameter("radiobutton");

とすれば、p2 は "2" になります。

Qフォーム上で押されたボタンによってサーブレットの処理を変えたい

Urizakaです。
さて、さっそく質問です。
JSPの同一フォーム上に「登録」「修正」「削除」のボタンを置き、その押された
ボタンによってサーブレット内での処理が切り替わる(具体的には、違う
SQL文を実行し、違うJSPページをgetRequestDispatcherメソッドで生成
する)ようにしたいのですが、どのようにすればよいのでしょうか?
もちろんそれぞれの処理に対して別々のサーブレットを作り、javaScript
でそれぞれのサーブレットへ飛ぶように制御するという処理も考えたことは
考えたのですが、できれば一つのサーブレットで済ませたいと考えたもので
…宜しくお願いします。

Aベストアンサー

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=MySubmit>
</form>

<script language="JavaScript">
function func(MyCommand){
document.MyForm.MySubmit.value=MyCommand;
document.MyForm.submit();
}
</script>

■Servletでの処理
// リクエストの取得
String MyAction = req.getParameter("MySubmit");

// 処理の実行
if (MyAction.equals("Toroku")){...}
if (MyAction.equals("Shusei")){...}
if (MyAction.equals("Sakujo")){...}



---------------------------------------------------

こんな感じでどうでしょうか。
ちなみにこうやって書いておくと、フォームのボタンからじゃなくても
アンカーをクリックすることで同じ効果が出せそうな……

<a href="JavaScript:func('Toroku')">登録</a>

あ、でもまたボロが出そうなのでこの辺で(^_^;)

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=M...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング