電子書籍の厳選無料作品が豊富!

お世話になります。

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

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

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

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

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

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

A 回答 (4件)

こんにちは。



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

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

// 画像ファイルのパス
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からファイル名を取得する)

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

LancerVII様

有難うございました。

かなり分かってきました!
ありがとうございます。

ベストアンサーとさせて頂きます!!

お礼日時:2013/04/26 17:16

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



基本的にはそれでよいと思います。

1) 別の HTTPサーバに置く。
2) 別のファイル保管専用のWebアプリの中に置く
3) 任意のファイルシステム上のフォルダやFTPサーバにおいて
Servlet でアクセスする。

この回答への補足

tknakamuri様
ご回答有り難うございます。

1はユーザーが画像をアップしたら、
そのタイミングで、別サーバーに転送するということだと思います
(もちろん、ファイル名が被らないようにリネームしてあげる必要があると思います)。

2と3もだいたいそうことだと思いますが合っているでしょうか。

また、ネットを見ていましたら、データベースに登録し、
それを読み込み表示するということもできるようですね。

DB保存パターンでももうちょっと調べてみたいと思います。

ありがとうございます。

補足日時:2013/04/26 15:57
    • good
    • 0

こんにちは。



ディレクトリ名からしたらテンポラリファイルの置き場所と考えるので永続的に利用するファイルを格納するのは避けます。
(例えば他の人がtempディレクトリだから中のファイル消しちゃえとか)

ディレクトリを作成できる権限があるなら任意のディレクトリを作成してそこに格納すれば良いと思います。

>jspから(※1)の場所にアクセスできるのか?
<img src="xxx/xxx.jpg">というパスでは無理ですね。
ROOT配下がドキュメントルートのはずですので。

なので先の回答にある方法で取得します。
jspでもServletでも良いですが、ファイルを直接読み込んで適切なヘッダを設定し書き出してあげれば、直接アクセスできない部分にファイルを保管しても、ブラウザ上で表示が可能です。

この回答への補足

LancerVII様

ご回答有り難うございます。

>ディレクトリを作成できる権限があるなら任意のディレクトリを作成してそこに格納すれば良いと思います。
>jspでもServletでも良いですが、ファイルを直接読み込んで適切なヘッダを設定し
>書き出してあげれば、直接アクセスできない部分にファイルを保管しても、ブラウザ上で表示が可能です。

以下のように理解したのですが、合っていますでしょうか?

任意のディレクトリに画像を保存し、jsp(or Servlet)から読み込む。
その後、ファイルごとにヘッダを指定してあげる。
その後書き出してあげれば、画面に表示される。

理屈はなんとなく分かってきましたが、
実際にコードに書くとなると手が止まってしまいます。

もうちょっとだけアドバイスいただけると嬉しいです
(実際のコードはこんなかんじだよとかございましたら。。。。)。

補足日時:2013/04/26 15:34
    • good
    • 1

こんにちは。



通常TomcatとApacheを連携させて実運用すると思いますので、ユーザが登録するファイルなんかは全てApache側に保存しています。
または外から見えない場所に置いて、サーブレット経由でファイルを取得したりしています。
(ダウンロードさせるファイル等)

この回答への補足

LancerVII様

御回答有り難うございます。

作成しているアプリケーションは、jelastic(http://jelastic.com/ja/java-paas)とう
サービスを利用しています。

このサービスの環境作成で、tomcatをアプリサーバーとして作成していますので、アパッチとの連携はしておりません。
(説明が足りず申し訳ありませんでした)

現在のディレクトリ構成を確認したら以下のようになっていました。

/root
|-bin
|-conf
|-lib
|-logs
|-temp (※1)
|-webapps
  |-ROOT
   |-META-INF
   |-WEB-INF
   |-css
   |-img
   |-js
   |-jsp
   |-tmp
   |-index.jsp

この場合は(※1)のtempに置くのがいいのでしょうか?
しかし、jspから(※1)の場所にアクセスできるのか?という疑問が生まれてしまいます。

よろしければアドバイスをお願い致します。

補足日時:2013/04/26 11:30
    • good
    • 0

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