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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

5336閲覧

servletとjspで画像をアップロードして保存したい

wtp

総合スコア2

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

1クリップ

投稿2020/11/21 09:34

前提・実現したいこと

最近javaの学習を始めた者です。
servletとjspでCDの情報をアップロードするシステムをネットの情報を頼りに作っています。
フォームで画像をアップロードし、タイトルとアーティスト名と値段を入力、画像をWebContent配下のimagesフォルダに保存、入力した内容とファイル名をデータベースに保存したいと思っています。

発生している問題・エラーメッセージ

エラーは出ないですし、データベースへの保存は問題なく行えているのですが、
imagesフォルダに画像が保存されません。どのように記述すれば保存されるでしょうか。

後、「@MultipartConfig(location = "/tmp/")」の/tmp/が
何を指しているのか分かりません。ネットで調べた所一時保存するフォルダとの事ですが
今一ピンとこないのでlocation = "/tmp/"についても教えて頂きたいです。

該当のソースコード

java

1package management; 2 3import java.io.IOException; 4import java.sql.Connection; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8import javax.servlet.ServletException; 9import javax.servlet.annotation.MultipartConfig; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14import javax.servlet.http.Part; 15 16import database.BaseDatabase; 17 18/** 19 * Servlet implementation class addProduct 20 */ 21@WebServlet("/AddProduct") 22@MultipartConfig(location = "/tmp/") 23public class AddProduct extends HttpServlet { 24 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 26 // TODO Auto-generated method stub 27 Part part = request.getPart("images"); 28 String fileName = part.getSubmittedFileName(); 29 part.write(getServletContext().getRealPath("/images") + "/" + fileName); 30 31 String title = request.getParameter("title"); 32 String artist = request.getParameter("artist"); 33 String price = request.getParameter("price"); 34 35 Connection con = null; 36 PreparedStatement stmt = null; 37 try { 38 con = BaseDatabase.getConnection(); 39 stmt = con.prepareStatement("INSERT INTO products (title,artist,price,images) VALUE (?,?,?,?)"); 40 stmt.setString(1, title); 41 stmt.setString(2, artist); 42 stmt.setString(3, price); 43 stmt.setString(4, fileName); 44 stmt.executeUpdate(); 45 request.setAttribute("msg", "アップロード完了"); 46 } catch(SQLException e) { 47 e.printStackTrace(); 48 } catch(Exception e) { 49 e.printStackTrace(); 50 } finally { 51 try { 52 if(stmt != null) {stmt.close();} 53 if(con != null) {con.close();} 54 } catch(SQLException e) { 55 e.printStackTrace(); 56 } catch(Exception e) { 57 e.printStackTrace(); 58 } 59 } 60 61 request.getRequestDispatcher("newProduct.jsp").forward(request, response); 62 63 } 64 }

java

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6<meta charset="UTF-8"> 7<title>商品追加画面</title> 8 9<jsp:include page="headerMng.jsp" /> 10 11<section class="admission"> 12<h2>新規商品追加</h2> 13<p>${requestScope['msg']}</p> 14<form action="AddProduct" method="post" enctype="multipart/form-data"> 15<input type="file" name="images" required> 16<input type="text" name="title" placeholder="タイトル" required> 17<input type="text" name="artist" placeholder="アーティスト" required> 18<input type="text" name="price" placeholder="プライス" required> 19<input type="submit" value="登録"> 20</form> 21</section> 22 23<jsp:include page="footer.jsp" />

java

1//headerMng.jsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<link rel="stylesheet" href="css/reset.css"> 5<link rel="stylesheet" href="css/style.css"> 6<meta name="viewport" content="width=device-width,initial-scale=1.0"> 7</head> 8<body> 9<header class="header"> 10<h1><a href="index.jsp">ShopLink</a></h1> 11<a href="newProduct.jsp" class="cart">商品追加</a> 12<a href="customerList.jsp" class="account">顧客管理</a> 13</header>

java

1//footer.jsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<footer>Copyright &copy; shoplink All rights reserved</footer> 5</body> 6</html> 7

試したこと

@MultipartConfig(location = "/tmp/")の/tmp/を/imagesに変えて試してみたり、
PC上のtmpというフォルダを全て確認したりしました。

補足情報(FW/ツールのバージョンなど)

PCはmacでOSのバージョンは10.15.7、javaのバージョンは15、tomcatは9.0でeclipse使用です。

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

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

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

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

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

gpsoft

2020/11/21 12:12

`write()`の引数に、書き込み先ファイルのパスを指定してますが、 これが、ちゃんとしたパスになってるか確認してみて頂けますか。 ↓たとえば、こんな感じで `System.out.println(getServletContext().getRealPath("/images") + "/" + fileName);`
wtp

2020/11/21 13:21

確認した所、 /Users/ユーザー名/Documents/work/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/shoplink/images/zep4.jpg とのことで、/.metadataと言うのがワークスペース(/work)の中の不可視ファイルにありました。どうやらちゃんとしたパスになっていなかったようですね。。。
gpsoft

2020/11/21 13:33

パスは問題ないような気がしますが…。 実は、ちゃんと保存できてるのでは? しかし、いずれにしろ、アップロードされたファイルを WebContent配下に保管するのはマズイかもしれません。 ここに置いておくと、tomcatがwarファイルを展開するたびに、 アップロードファイルが消えちゃうんじゃないかな…。
wtp

2020/11/21 13:45

一応imagesフォルダを確認したのですが空のままでした。 因みに、imagesフォルダは何処に配置するのがいいと思いますか? /shoplinkフォルダの外でしょうか。
gpsoft

2020/11/21 13:55

そうですね、/shoplink配下を避けて、適当な場所を選べば良いと思います。 とりあえずDocumentsの下にでも専用のディレクトリを作って、そこへ出力してみたらどうでしょう?
wtp

2020/11/21 14:03

ありがとうございます!Documentsの下にディレクトリを作ってそこのパスを指定したら保存されました。 しかし保存したファイルをまたjspファイルで<img src="">の形式で読み込んで表示したいのですがその場合も絶対パスで指定するのでしょうか。 <img src="user/ユーザー名/Document/images/zep4.jpg">とかですかね。
gpsoft

2020/11/21 14:43

絶対パス指定ではダメですね。src属性には、ファイルシステムのパスじゃなく、URL(のパス)を指定する必要があるので。 じゃぁ、どうするか…。 いろんな方法があると思いますが、例えば↓これが参考になりそうです。 https://stackoverflow.com/questions/1812244/simplest-way-to-serve-static-data-from-outside-the-application-server-in-a-java 要するに、tomcatの設定ファイルに、<Context docBase="/Users/ユーザ名/Documents/storage" path="/images" /> などと書いておけば、img要素のsrc属性は、"/images/zep4.jpg" で良いはずです。 すみませんが、この辺は詳しくないので、私も試行錯誤してみないと自信が無いです。
wtp

2020/11/22 00:57

了解しました、何度も丁寧にありがとうございました。
guest

回答1

0

ベストアンサー

今一ピンとこないのでlocation = "/tmp/"についても教えて頂きたいです。

アップロードされたファイルは、自動的にサーバのファイルシステム上のどこかへ保管されます。その「どこか」を指定するのがlocationです。

今回は/tmp/を指定したので、アップロードされたファイルは、一旦、このディレクトリの下に保管されます。そのあと、Servletがpart.write()することにより、そのファイルの中身を任意の別ファイルへコピーしてるわけですね。

/tmpは特別なディレクトリで、この下のファイルは、OSが適当なタイミングで削除してくれます(たぶん)。

投稿2020/11/21 13:48

gpsoft

総合スコア1323

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問