サーブレットでの画像処理時のパス指定に関する問題
- サーブレットでの画像処理時にパス指定の方法に問題が発生
- クライアントから受け取ったファイルパスを連結させる際にIIOExceptionが発生
- 直接ファイルパスを指定すると正常に処理されるが、変数を使用すると例外が発生
- ベストアンサー
サーブレットでの画像処理時のパスの指定
クライアントからファイル名をサーブレットに渡し、 そのファイルをImageIOでクライアントに返して表示させるプログラムを組んでいます。 そこで、クライアントからパラメータで受け取った文字列(画像ファイル名)を変数に入れ、 サーブレット側で指定してある文字列(ファイル格納ディレクトリへのパス)の最後にその変数を連結させたものから Fileオブジェクトを作り、ImageIOのreadメソッドの引数として指定したところ IIOExceptionの例外が発生します。(Can't read input file!) サーブレット側でファイルへのパスを直接指定したものでFileオブジェクトを作って実行するとうまくいきます。 原因は何なのでしょうか? String filename = request.getParameter(クライアントから受け取ったファイル名); ServletContext sc = getServletContext(); String filepath = sc.getRealPath("/img/"+filename); response.setContentType("image/jpg"); File file = new File(filepath); BufferedImage readImage = ImageIO.read(file); ←ここで例外が発生します ImageIO.write(readImage, "jpg", response.getOutputStream()); 開発環境はEclipce,Tomcatです。
- YOKO-45
- お礼率73% (11/15)
- Java
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> サーブレット側でファイルへのパスを直接指定したものでFileオ > ブジェクトを作って実行するとうまくいきます。 あなたが直接指定した文字列と、request.getParameter()で受け取った文字列またはそれを使って合成したパスの文字列が、同じでない、としか言えませんね。そのへんのデバッグは、すでにやっていますか?
関連するQ&A
- 【Java】読み込んだ画像の色がおかしい
Java の BufferedImage を使ってJPGファイルを読み込むと、 ファイルによっては色が写真のネガのように変わってしまうことがあります。 本当は読み込んだJPGファイルを編集したいのですが、 次のように読み込んで出力するだけで、この現象が起きます。 String orgImageFile = "test.jpg"; // 読み込むファイル String outputFile = "output.jpg"; // 出力するファイル BufferedImage orgImage = ImageIO.read(orgImageFile); ImageIO.write(orgImage, "jpg", new File(outputFile)); なにか解決策はございませんでしょうか。 よろしくお願い致します。
- ベストアンサー
- Java
- サーブレットコンテキストの意味がわからなくて困っています。
やさしいJava活用編で勉強しているのですが、 サーブレットコンテキストの説明が書いてなく、ネットで調べても意味不明です。 サーブレットコンテキストは、 javax.servlet.ServletContextインタフェースを実装するクラスのインスタンスで、そのアプリケーションに一つあるとのことですが、 そのサーブレットコンテキストの意味がわからなくて困っています。 HttpSessionのようなもので、クライアントではなく、そのアプリケーションに対して1つあるということですが... ServletContextオブジェクトは、具体的に何の情報を持っているのですか? また以下のソースですが、 なぜ指定されたパスにあるリソースを、ラッパーとして機能するRequestDispatcherオブジェクトを返してから、 forwardで転送するのですか? ServletContext sc = getServletContext(); sc.getRequestDispatcher("/thanks.html").forward(request, response);
- ベストアンサー
- Java
- ダウンロードサーブレットでキャンセル時のエラー
ファイルをダウンロードさせるservletを以下のソースのように作っています。 ブラウザ側で「ファイルの保存ダイアログ」の「キャンセル」を行われた際に以下のようなエラーが表示されます。 エラーを回避する方法、あるいは対処の方法はあるのでしょうか?どなたかご教授下さい。 環境:Windows XP,Tomcat 5.0.28,IE 6.0 ソース(一部) --------------- String fileName1= rs.getString(1); InputStream data = rs.getBinaryStream(2); String contentType = rs.getString(3); String fileName2 = URLEncoder.encode(fileName1,"UTF-8"); //contentTypeを出力 response.setContentType(contentType); //ファイル名の送信(attachment部分をinlineに変更すればインライン表示) response.addHeader("Content-disposition","attachment; filename=\""+fileName2+"\""); //ファイル内容の出力 ServletOutputStream out = response.getOutputStream(); //InputStream fin = new InputStream(fileName2); int size; while((size = data.read(buffer))!=-1){ out.write(buffer,0,size); //←エラー発生箇所 } data.close(); out.flush(); out.close(); エラー -------------- ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error at org.apache.coyote.tomcat5.OutputBuffer.realWriteBytes(OutputBuffer.java:373) at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:398) ・・・
- 締切済み
- Java
- 画像ファイルを削除出来ません(サーブレット)
ImageIO.write()で作成した画像のパスでFileを生成し そのパスの画像を削除したいのですがうまくいきません。 .exists()は通ります。 コンソールでパスを確認しましたが問題ありませんでした。 しかしdelete()を実行しても削除される時と削除されない時があり 不安定な動作です。 例外は発生してません。 解決するにはどうすればいいのでしょうか? String userName = req.getParameter("userName"); HttpSession sessions = req.getSession(); StringBuffer imageFilePath = new StringBuffer(getServletContext().getRealPath("websitePrototype/spot/thumbnailImages")); imageFilePath.append((String)sessions.getAttribute(userName + "Image")); System.out.print(imageFilePath); /////画像を保存したファイルまでのパスでFileオブジェクト生成 File imageFile = new File(imageFilePath.toString()); try{ ////イメージファイルが存在するか調べる if(imageFile.exists()){ ////イメージファイルを削除 imageFile.delete();
- ベストアンサー
- Java
- サーブレットからJSPへフォワード 画像が・・・
サーブレットからJSPへフォワード 画像が・・・ javaの勉強をしながらサーブレットやJSPを使ったページを作ってるのですが、サーブレットで処理を行った後にJSPへ sc.getRequestDispatcher("/index.jsp").forward(req, res); で転送したら画像が表示されません。 JSPで記述したページを直接開いたりresponse.Redirect(URL)で遷移した場合は画像もちゃんと表示されます。画像だけではなくスタイルシート等も読み込んでいないようなのです・・・orz どうしたらいいのでしょうか? 【ファイル構成】 [プロジェクトフォルダ] JSPファイル(.jsp) [image] 画像ファイル [style] スタイルシート [WEB-INF] [classes] サーブレットファイル(.class)
- ベストアンサー
- Java
- 画像読み込み時のOutOfMemory
VC++2010ExpressのWindows Applicationで画像のサムネールを作るプログラムを作っています。 概略、つぎの様なコーディングです(細部は気にしないで下さい)。 for filePath in dlg->Files{ try{ String^ FileName = Path::GetFileName(filePath); Image^ img = Image::FromFiles(filePath); Bitmap^ bmp = gcnew Bitmap(Image, 48, 48); bmp->Save(FolderPath + "\\Thumbnails\\" + FileName); } chactch(System::Exception^ err){ Debug::Print("{0}", err->Massages); } } 問題は、数万件の画像を処理したときに、数千件までは順調に処理が進むのに、そのあと「OutofMemory」とか「メモリー不足」とか「GDI+で汎用エラー」といった例外が続発してしまうことです。マネージコードなのでリソースは自動的に解放されると思うのですが、それでも間に合わないのでしょうか?何か対処方法があれば、ご教示ください。
- 締切済み
- C・C++・C#
- サーブレットからIMGタグへ画像が送れない
Apache1.3.26とTomcat4.0.6でjava1.4でIEに画像を表示するシステムを開発しています。 Tableタグで構成した表内に、サーブレットをリンク先としたIMGタグを3つ記述してあります。 <tr><td> <img src='../servlet?param='aa''></a> </td><tr/><tr><td> <img src='../servlet?param='bb''></a> </td><tr/><tr><td> <img src='../servlet?param='cc''></a> </td><tr/> このタグ内に記述しているサーブレットでは、DBより取得したパスを元にJpegファイルを 読込み、レスポンスに渡しています。 response.setContentType("image/pjpeg"); response.addHeader("Content-Disposition","inline; filename=" + fileName); InputStream in = null; OutputStream out = null; try { in = new FileInputStream(ImagePath); out = response.getOutputStream(); int b; while ((b = in.read()) != -1) { out.write(b); break ; } } finally { if (in != null) { in.close(); } if (out != null) { out.flush(); out.close(); } } IEにこのHTMLを表示させると、ほとんどの場合はJpeg画像が表示されるのですが、 まれに表示されずに×印が出てしまうことがあります。 右クリックメニューより「画像の表示」を行うと表示されますが、ページを表示した際に表示されていないと使えるシステムとなりません。 何が原因なのかわからず、対処のしようがない状態です。 どなたか原因、対処方法についてご教授いただけないでしょうか?
- ベストアンサー
- Java
- サーブレットで外部テキストファイルからの出力が文字化け
サーブレットで、外部テキストファイルを読み込んで、それをHTMLとして出力すると、日本語部分が文字化けしてしまいます。 外部ファイルの文字コードはUTF-8Nになっていますし、ブラウザで他の文字コード(Shift-JIS、EUC-JP)で表示するように指定しても、文字化けするだけでした。 なお、環境は、 JDK:Java 6 Update 3 サーブレットコンテナ:GlassFish v2 OS:Windows XP Home SP2 開発環境:NetBeans 6.0 (+日本語言語パック) ソースコードは以下のとおりです。 private void printFile(String filePath, PrintWriter out) throws FileNotFoundException, IOException{ FileReader file = new FileReader(getServletContext().getRealPath(filePath)); BufferedReader bfile = new BufferedReader(file); //一行の文字列 String line; while(true){ //ファイルから一行読み取る。読み取れなかったらループ終了。 if((line = bfile.readLine()) == null){ break; } //一行出力(ここは日本語が文字化け) out.println(line); } bfile.close(); file.close(); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); //中略 out.println("<meta http-equiv=\"Content-Type\" " + "content=\"text/html; charset=UTF-8\">"); //中略 out.print("ここは正常に表示される"); //中略 printFile("/file.txt",out);//ここで日本語が文字化け } ・・・よろしくお願いいたします。
- ベストアンサー
- Java
- javaでメモリ使用量が増え続ける
public class Main extends JFrame{ public static void main(String args[]){ Main frame = new Main("test"); frame.setVisible(true); } Main(String title){ setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint(Graphics g){ Graphics2D g2 = (Graphics2D)g; BufferedImage readImage = null; try { readImage = ImageIO.read(new File("ファイルへのパス")); } catch (IOException e) { e.printStackTrace(); } g2.drawImage(readImage, 0, 0, this); readImage.flush(); g.finalize(); g2.finalize(); g.dispose(); g2.dispose(); } } いま、画像を表示するプログラムを上のように書いたのですが、ウィンドウのサイズを変更したりしてpaintが呼ばれるごと(多分)にメモリの使用量が増えていきます。 そして、メモリの使用量が減ることはなく常に増えてしまってます。 windowsのタスクマネージャーでメモリの使用量は見てます。 なぜこのようなことが起こってしまうのでしょうか?? また、どのようにすればメモリの使用量が増えることがないようにすることができるでしょうか?? よろしくお願いします。
- 締切済み
- Java
- サーブレットの文字化け
こんにちは。 JAVAサーブレット時の文字化けで困っています。 環境 ≪サーバー≫ OS:Linux Tomcat4.1.31 JAVA1.4.2 ≪クライアント≫ OS:Windows2000 クライアントからhttp:192.168.X.X:8080/xxx.jspを呼び出して実行しています。 JSPファイル(Shift-JISで保存)からサーブレットを呼び出して サーブレットでrequest.getParameterをした時に、日本語が文字化けしてしまいます。 JSPファイルでは <%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%> を指定しています。 なにかわかりましたら教えてください。 よろしくお願いします。
- ベストアンサー
- Java
お礼
ranco様 クライアント側からPrintWriterで文字列を送る時に、println()で書き込みを行っており、 改行コードが入ってしまったせいでファイルのパスが間違いになってしまっていました。 文字列でデバッグした際は目に見えずに何がおかしいのかわかりませんでしたが、 文字列のデータを見た際、一番最後に違うものがついていたので気づきました。 また、この度は返事が大変遅れて申し訳ありませんでした。