- PR -

JSPからフォームで画像ファイルをレンタルサーバにuploadしたい。

投稿者投稿内容
未記入
会議室デビュー日: 2005/04/24
投稿数: 2
投稿日時: 2005-04-24 18:29
はじめまして。JAVA初心者です。
いろいろ調べたのですが、「どうしてもわからない!」のでこちらに投稿させて頂きました。
初歩的な質問でしたら申し訳ありませんが、とても困っています。
現在webサイトをjsp/Servletで制作しています。
サイト利用者がフォーム(から、画像ファイルをuploadして、そのファイルデータを
サーバに保存したいのですが、うまくできません。
localhost上でテストしたときは、きちんと保存できたので、なにかサーバ上の問題なのだと思うのですが、解決することができません。
環境:Jk2-2.0.4 is used to connect Apache 1.3.31 to Tomcat 5.0.27.
   Java hosting accounts share one JVM.
海外のレンタルサーバを利用してます。

**********************************************
Servlet.java
**********************************************
import java.sql.*;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;
import xxxxxxx.*;

public class xxxxxxxxxxxxServlet extends HttpServlet{

//.拡張子を返すメソッド
private String getExt(String filename) {
String ext = "";
int pos = filename.lastIndexOf(".");
if (pos > 0) {
ext = filename.substring(pos, filename.length());
}
return ext;
}

// FileItemの形式がimageかどうかを調べるメソッド
public boolean isImageFile(FileItem f){
if((f.getContentType()).matches("^image/.*")){
return true;
}else{
return false;
}
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{

request.setCharacterEncoding("Shift_JIS");
//変数の宣言
String errStr="";
String IMAGE_DIR = "image";
String comment ="";
String newFileName ="dammy"

//imageファイルの絶対パス取得
String imageDir = getServletContext().getRealPath(IMAGE_DIR);

//tempファイルのディレクトリ取得
ServletContext context = getServletConfig().getServletContext();

File tempdir = ( File )context.getAttribute("javax.servlet.context.tempdir");

//upload処理環境の設定
DiskFileUpload dfu = new DiskFileUpload ( new DefaultFileItemFactory());

dfu.setSizeThreshold(1024*1024);

dfu.setSizeMax(1024*1024*20);
//キャッシュ先
dfu.setRepositoryPath(tempdir.getAbsolutePath());

dfu.setHeaderEncoding("Shift_JIS");

List fileItems=null;

try{
//upload処理の実行
fileItems = dfu.parseRequest(request);

}catch(Exception e){
e.printStackTrace();
request.setAttribute("errStr","ファイルアップロードエラーです。");
getServletContext().getRequestDispatcher("/top.jsp").forward(request,response);
return;
}

Iterator iter = fileItems.iterator();
//各パートの処理
while(iter.hasNext()){
//フィールドの入力値のpartの場合
FileItem item = (FileItem)iter.next();

if(item.isFormField()){

//フィールドの入力値の場合
//フィールド名の取得
String fieldName = item.getFieldName();
if(fieldName.equals("comment")){
comment = item.getString();
}


}else{

if(!isImageFile(item)){
errStr += "指定のファイルは画像ファイルではありません。<br>";
request.setAttribute("errStr",errStr);

}else{

//送信元にあった時のファイル名で取得
String uploadName = item.getName();

//パス名を除くファイル名取得
String fileName = new File(uploadName).getName();
File directory = new File(imageDir);
//アップロードされたファイルの保存名を作成
File file = new File (directory, newFileName + getExt(fileName));
directory.mkdir( );
file.createNewFile( );

try{
//ファイルの保存
item.write(file);
imagePhoto= file.getName();

}catch(Exception e){

e.printStackTrace();
errStr += "ファイルが保存できませんでした。<br>

}

item.delete();

}
}
}

if(!errStr.equals("")){
//エラーメッセージをかえす
request.setAttribute("errStr",errStr);
getServletContext().getRequestDispatcher("/top.jsp").forward(request,response);
return;

}else{

try{
//MYSQLデータベースへの接続処理
Connection con = Connect.getConnection();
//SQLの発行準備
xxxxxxxx xx = new xxxxxxxx(con);
// 新規レコードの追加
xxxxxxxxBean xxx = new xxxxxxxxBean();

xx.setComment(comment);
xx.setImage(imagePhoto);
xxx.insert(xx);
con.close();

}catch(Exception e){
e.printStackTrace();
getServletContext().getRequestDispatcher("/errorPage.jsp").forward(request,response);
return;
}
getServletContext().getRequestDispatcher("/coplete.html").forward(request,response);
}
}
}

***********************************************
エラーメッセージ
***********************************************
HTTP Status 500 -

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

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

java.security.AccessControlException: access denied (java.io.FilePermission /home/*****/***/****/******/********/html/image write)
java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)
java.security.AccessController.checkPermission(AccessController.java:427)
java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
java.io.File.mkdir(File.java:1119)
FParentsRegistrationServlet.doPost(Unknown Source)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
sun.reflect.GeneratedMethodAccessor237.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:585)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:239)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:266)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:157)
java.security.AccessController.doPrivileged(Native Method)
net.skirnir.catalina.servlets.MultipartFilter.doFilter(MultipartFilter.java:69)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:585)
org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:239)
java.security.AccessController.doPrivileged(Native Method)
javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:266)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:213)


note The full stack trace of the root cause is available in the Apache Tomcat/5.0.27 logs.


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

Apache Tomcat/5.0.27

以上です。どなたか解決策をお願いいたします。
初歩的な質問だったら申し訳ありませんが、よろしくお願いします。
ねく
会議室デビュー日: 2005/04/19
投稿数: 11
お住まい・勤務地: Tokyo
投稿日時: 2005-04-24 19:02
例外だけちょっと見ただけなので、外している可能性大ですが。

Javaのセキュリティマネージャーが効いてるので、それでパーミッション違反で
例外を投げてる感じです。

デフォルトだとリソースへのアクセスがかなり制限されているので、その辺を
見直してみてはどうでしょう。

・・・ん?

海外のレンタルサーバ・・・。
_________________
nec spe nec metu.

ねく
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-04-24 21:07
単にアップロード先のフォルダとかに書き込み権限がないだけじゃないでしょうか?
エラーメッセージの先頭にもパーミッションのエラーだと表示されてますし。


ちょっと予断ですが、「どうしてもわからない!」って強調すればいいってもんじゃありませんよ。少なくとも私の場合は少しむかつきます。
私もバカじゃないですから、どの程度調べたのか、ほんとにどうしても分からないのかはあなたの文面で判断できますからね。

あと、サーバによるのかどうかよく知りませんけどShift_JISって使えるんですかね。
未記入
会議室デビュー日: 2005/04/24
投稿数: 2
投稿日時: 2005-04-24 23:39
responseいただきありがとうございます。
わかる方には、しょうもない質問かもしれないんですが、
正直、この件で1週間ほどネットや本屋などで、かなり調べ、何度もいろいろな
方法を試しましたが、初心者の自分では解決策が見つからなく困っていたので
こちらに書き込みさせていただいた次第です。
「どうしてもわからない!」という表現が間違ってたのでしょうか?

書込権限は書き込めるようにしています。

>Javaのセキュリティマネージャーが効いてるので、それでパーミッション違反で
>例外を投げてる感じです。

そのセキュリティマネージャーというのは、サーバ側にセキュリティがかかっているということですか?セキュリティマネージャーついても、よくわからないので、すいません。質問ばかりで。
それは「このサーバには書き込めませんよ」という根本的なことではなく、ディフォルトの設定のままになっているからなんでしょうか?
ということは、servletになにかその辺の設定をいれなきゃいけないんですね??

ねく
会議室デビュー日: 2005/04/19
投稿数: 11
お住まい・勤務地: Tokyo
投稿日時: 2005-04-25 01:50
こんばんわ。眠いので・・・ヒントだけというか、後は自分で調べて、
そちらの環境等と照らし合わせた方がいいかと。

「java.security.AccessControlException: access denied」

これでググったりすると、色々出てくるので幸せになれるかもしれません。

JavaTM 2 プラットフォームのセキュリティに導入された機能

これを参考にするとか。

これが原因ならポリシーファイルでAllPermissionを許可すれば、とりあえずは動くのではと思います。
_________________
nec spe nec metu.

ねく
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2005-04-26 05:53
引用:
「どうしてもわからない!」という表現が間違ってたのでしょうか?


ちょっと補足します。
質問しているのですから分からないからのは当然分かります。
別に分からないと書くことがどうのこうのって言いたいんじゃないんですよ。
私は、あなたが分からないことを「強調」するその姿勢を疑問に思いました。
質問するときに、なぜ分からないことを強調しようと思いましたか?
質問文としては、なんかポイントがずれていると思いますよ。

#初心者を強調したがる人も同様ですけどね。


でと、本題。
エラーログ見直しました。
あなたがコピー&ペーストできる答えが欲しいのではないことを期待します。
そうでないなら、以下は読まないでください。たぶん、あなたは怒るだけでしょうから。




あなたのサーブレットのソースの中でどの行でエラーになっているのでしょうか。
エラーログに書いてますよね。

そこからどんなエラー(「どういう意味の」エラー)が出ていますでしょうか。

なぜそのエラーが出たのかを考えてみてください。
ひょっとしたらこれが原因かもという推測がいくつか思いつきますよね。
別に思いっきりはずしていてもかまいません。
どういうときにそのメソッド(もしくはその行)でそういう「意味の」
エラーが発生するのか想像してください。

(ここは知識や経験によって差が出ます。ですが初心者だからというのを
理由するのは、単にやる気がないとしか思えません。)

その思いついたエラーの発生した原因(の推測)を1つ1つ調べていきましょう。

あなたはかなり調べたといってますけど、そのエラーとなったメソッドや、
発生したエラーがどういう意味のエラーなのかとかに関して、JavaDocすら
見ていないと思えます。
ひょっとしたら、どの行でエラーになっているのかすら調べてないのって
思えます。

かなり調べたと書いただけで、具体的に何について調べたのでしょう?
単にやる気はあるんだ。努力しているんだといいたいだけでしょうか?
私は疑問に思います。ホントに調べたのって。

でと、脱線して申し訳ありません。

で、そうやって調べて、それでも分からないってのであればどうどうと
質問すればいいんです。
もしそうなら、質問のタイトルから、質問の文面から、質問の内容から、
すべて今のとは全く異なったものになることでしょう。
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-27 09:23
どうも、おはようございます。

ソースも、エラーもよくよんでませんが、
私だったらいつもこうやってエラーを調べている。
っという事でも多少はお役にたてるかと思い、レスいたします。

1、AccessControlContext.java の 264行目を見てみる。
(今回これがサーバ側なのでみれるかわかりませんが)

2、java.security.AccessControlException: access denied
でぐぐる。

3、とりあえずエラーの翻訳。
java.security.AccessControlException: 拒絶されたアクセス
(今回は翻訳しなくてもわかるけど^^

4、後は予測して「拒絶 サーバ JSP」
などでググル。

5、それでもわからないときは、処理を紙に書いてゆっくり考える。

6、それでも、わからないときはお手上げ、、、(質問とかにだします)

他の人からみたら、変な事してるのかもしれないですが、
私はこうしてエラーの内容と回避のしかたを調べてます。

参考にならないかもしれないですけど、参考になればいいな、、、

*特に(本当に全然)関係ない話なんですが、、、「未記入」さんって、
沢山いるんですね、、、(汗
私は[kami]という名前を使用してるように[未記入]という名前なのかとおもったら
デビュー日が全然違うことで別人なんだと今気がついた!w

[ メッセージ編集済み 編集者: kami 編集日時 2005-04-27 10:49 ]
techbits
会議室デビュー日: 2005/05/02
投稿数: 8
投稿日時: 2005-05-02 03:06
エロ画像投稿サイトでも作っていますか?(・∀・)ニヤニヤ

とりあえず権限がないだけに見えますが「書込権限は書き込めるようにしています。」というのは具体的にはどういう風にしたのでしょうか?
そのサーバのroot権限を持ってるとかですか?

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