質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

11422閲覧

フォームで画像データとテキストデータを一度に送受信したいです。

sususu

総合スコア99

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/03/13 15:33

編集2018/03/13 23:15

いつもお世話になります。
javaを勉強している初心者です。
表題の件に関して、前回の質問で同時に送信してゲットパラメータでデータを受け取るのは出来ないという事を教えていただき挑戦中なのですがわからないところが多々ありますのでご教授お願いいたします。

最終的にやりたいことは、「アップデートされた画像のパス」と「ファイルの名前」をテーブルに格納することです。

1.エラー
「upload.parseRequest(request);」に波線が付いてしまいます。
エラー内容は「型 FileUploadBase のメソッド parseRequest(RequestContext) は引数 (HttpServletRequest) に適用できません」となってしまいますがどのように対応したらよいでしょうか?

2.ファイル名の受け取り
jspのformで送信しているされている<input type="text" name="note"><br/>の値の取得の仕方はどのようにすればよいでしょうか?こちらは日本語対応でproperNameなどの変数に入れたいと思っています。

3.保存先のフォルダ
画像を保存するのWEB-INFの中が良いのでしょうか?
その場合WEB-INFの下にpictureフォルダを作成して
String path = getServletContext().getRealPath("WEB-INF/picture");
のように表記をするのでしょうか?

JSP <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form method="POST" enctype="multipart/form-data" action="UpLoad"> ファイルを選んでください<input type="file" name="upfile"><br/> ファイル名を入れてください<input type="text" name="note"><br/> <br/> <input type="submit" value="Press"> to upload the file! </form> </body> </html>
サーブレット package picAndText; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.tomcat.util.http.fileupload.FileItem; import org.apache.tomcat.util.http.fileupload.FileUploadException; import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; /** * Servlet implementation class UpLoad */ @WebServlet("/UpLoad") public class UpLoad extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //保存先ディレクトリを指定(下記の場合picture/fileName) String path = getServletContext().getRealPath("picture"); //様々なファイルデータを受け取れるオブジェクトを生成 DiskFileItemFactory factory = new DiskFileItemFactory(); //複数のファイルデータ分割して取得できるオブジェクトを生成 ServletFileUpload upload = new ServletFileUpload(factory); //アップロードする際の基準値を設定 factory.setSizeThreshold(1024); upload.setSizeMax(-1); //下記2件は良く分からないからコメントアウト //aactory.setRepository(); //upload.setHeaderEncoding("Windows-31J"); try{ //ファイルデータを取得 List<FileItem> items = upload.parseRequest(request); //Iteratorはコレクションフレーム Iterator<FileItem> iter = items.iterator(); //繰り返し処理で次があればtrueを返す while (iter.hasNext()) { FileItem item = (FileItem)iter.next(); //アップロードされたファイルのみ対象の処理 if (!item.isFormField()){ //PATHを含むファイル名を取得 String fileName = item.getName(); //もしファイル名があるなら if((fileName != null) && (!fileName.equals(""))){ //PATH名を除くファイル名のみを取得 fileName=(new File(fileName)).getName(); //ファイルデータを保存 item.write(new File(path + "/" + fileName)); //ファイル名を取得...したい... String properName = item.getContentType(); } } } //うまくいったらupLoadFinishへ RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/jsp/upLoadFinish.jsp"); dispatcher.forward(request, response); }catch(FileUploadException e){ e.printStackTrace(); }catch (Exception e) { e.printStackTrace(); } } }

2に関しては

getContentType java.lang.String getContentType() リクエストに含まれるメッセージボディの MIME タイプを返しますが、タイプがわからない場合は null を返します。 HTTP Servlet では CGI 環境変数の CONTENT_TYPE の値に相当します。 戻り値: リクエストの MIME タイプの名前を含む String

というのを見つけたのでgetContentTypeなのかと思ってしまっていますがまったくわかりません。
サイトは下記を参考にさせていただきました。一応翻訳なども使い読んでみましたがいまいちわかりません。
コメントも書きながらなので読みにくくて申し訳ありませんがよろしくお願いいたします。

開発環境
OS windows10
エディション enterprise
言語 java8.0.1310.11
MariaDB10.1
HeidiSQL
eclipse NEON

参考サイト
https://commons.apache.org/proper/commons-fileupload/using.html
http://www.javaroad.jp/servletjsp/sj_servlet12.htm
https://www.javadrive.jp/servlet/fileupload_tutorial/index5.html
http://d.hatena.ne.jp/chaoruko/20090828/1251452593
http://www.jajakarta.org/commons/fileupload-1.0/ja/withoutPrimary/org/apache/commons/fileupload/FileItem.html#getFieldName()

追加画像
イメージ説明
リンク
https://www.javadrive.jp/servlet/fileupload_tutorial/index5.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/13 22:00

「アップロードされたファイルのみ対象の処理」 この下行理解して入れてる?
sususu

2018/03/13 23:12

早いコメントありがとうございます!理解しているかと言いますと正直ほぼ想像になってしまうかもしれないのですが、「パスを含むファイル名を取得」という事とサイトの情報(画像追加させていただきます)からユーザーが画像を保管しているパスが手に入ると思っております。例えばshibakenという名前の画像を持っていたとしてそれをanimalのファイルのdogのファイルの中に持っていたとしたらanimal/dog/shibakenというパスが取得できるのではないかと思っておりましたが違いましたでしょうか?長文失礼いたしました!
退会済みユーザー

退会済みユーザー

2018/03/13 23:21

なぜ否定式を利用していると思う?
sususu

2018/03/14 00:34

肯定文があるかどうかという認識がなかったのでキチンとは答えられそうにないのですが、送信されてきた画像ファイルとテキストファイルに該当するものを拾うためなのではないかと思っていましたが違いましたでしょうか?
guest

回答2

0

ベストアンサー

(1)について
importしているクラスが違うようです。参考にされているサイト( https://www.javadrive.jp/servlet/fileupload_tutorial/index5.html ) は、Apache commons-fileUploadを利用しているので、ソースに記載されている以下ではコンパイルエラーが出るでしょう。

java

1import org.apache.tomcat.util.http.fileupload.FileItem; 2import org.apache.tomcat.util.http.fileupload.FileUploadException; 3import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory; 4import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

次にすればよいかと。

java

1import org.apache.commons.fileupload.FileItem; 2import org.apache.commons.fileupload.FileItemFactory; 3import org.apache.commons.fileupload.FileUploadException; 4import org.apache.commons.fileupload.disk.DiskFileItemFactory; 5import org.apache.commons.fileupload.servlet.ServletFileUpload;

(2)について
アップロード後に、ファイルとパラメータで処理を振り分けて書いている実装例が公式サイトのガイドにもありますので、以下を参考にされると、処理が見やすくなるかと思います。

https://commons.apache.org/proper/commons-fileupload/using.html

java

1// Process the uploaded items 2Iterator<FileItem> iter = items.iterator(); 3while (iter.hasNext()) { 4 FileItem item = iter.next(); 5 6 if (item.isFormField()) { 7 processFormField(item); 8 } else { 9 processUploadedFile(item); 10 } 11} 12 13.... 14 15// 戻り値がvoidのままだと取得したパラメータの内容がサーブレットから参照しにくくなるので、工夫をしてください。 16private void processFormField(FileItem item) { 17 // Process a regular form field 18 if (item.isFormField()) { 19 String name = item.getFieldName(); 20 String value = item.getString("utf-8"); // 文字コードを指定しないとデフォルトはiso-8851で処理しているので文字化けする 21 // .....(取得したパラメータについての処理を以下に)....... 22 } 23} 24 25private void processUploadedFile(FileItem item) { 26 ......(アップロードの処理).... 27} 28

(3)について
置き場所については、WEB-INF以下に置くとサーブレットやJSP経由でなければ参照できなくなります。
アップロードされたファイルは常に画像取得用のサーブレットなどからレスポンスするものならWEB-INF以下に置いても良いかと思いますが、WEB-INF以下にはおかず、別途別のディレクトリに保管するなり、データベースに保管する場合もあるようですので、実装したい内容にあわせてください。

投稿2018/03/14 02:26

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sususu

2018/03/14 10:51

commonsのライブラリを入れないといけないとは知りませんでした!リンクまでありがとうございます!確認してみます!
guest

0

取得方法と意味の説明(ドキュメントの意訳、かみ砕いた状態)

FileItem item = (FileItem)iter.next(); Map<String,String> parameter = new HashMap(); // https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/tomcat/util/http/fileupload/FileItem.html // isFormField : Determines whether or not a FileItem instance represents a simple form field. // isFormField : (意訳)<form method="post" ... > 送信時の <input type="file"> は false , それ以外は true if (!item.isFormField()){ //PATHを含むファイル名を取得 String fileName = item.getName(); //もしファイル名があるなら if((fileName != null) && (!fileName.equals(""))){ //PATH名を除くファイル名のみを取得 fileName=(new File(fileName)).getName(); //ファイルデータを保存 item.write(new File(path + "/" + fileName)); //ファイル名を取得...したい... String properName = item.getContentType(); } } else { // getFieldName: Returns the name of the field in the multipart form corresponding to this file item. // getFieldName: (意訳) <input name="?" > の属性値 String fieldName = item.getFieldName(); // getString: Returns the contents of the file item as a String, using the specified encoding. // getString: (意訳) <input value="?" > の属性値 String fieldValue = item.getString(); parameter.put(fieldName,fieldValue); }

追記

ちなみに、古いバージョンの commons-fileupload/commons-io のコピーで依存関係をあいまいにするために以下のコードに変換する必要があります。

import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext; // 中略 ServletRequestContext rc = new ServletRequestContext(/* HttpServletRequest */ request); List<FileItem> items = upload.parseRequest(rc);

投稿2018/03/14 00:57

編集2018/03/14 11:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sususu

2018/03/14 10:52

コードまでありがとうございます! 試してみたいと思います!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問