実現したいこと
ファイルアップロード用のJSP画面にあるアップデートボタンを押下すると、doPost処理をServlet側に投げるようにしたいのですが、連携されない。
[実行環境]
・ecripse
・Tomcat10
・Java21
発生している問題・分からないこと
ファイルアップロード用のJSP画面にあるアップデートボタンを押下すると、doPost処理をServlet側に投げるようにしたいのですが、連携されない。
エラーメッセージ
error
1HTTPステータス 404 – 見つかりません 2タイプ ステータスレポート 3 4メッセージ 要求されたリソース [/Upload] は利用できません。 5 6説明 オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。
該当のソースコード
UploadServlet.java
1package upload; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.IOException; 6import java.io.InputStream; 7import java.io.PrintWriter; 8import java.util.Properties; 9 10import javax.servlet.ServletException; 11import javax.servlet.annotation.MultipartConfig; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16import javax.servlet.http.Part; 17 18import com.amazonaws.auth.AWSStaticCredentialsProvider; 19import com.amazonaws.auth.BasicAWSCredentials; 20import com.amazonaws.client.builder.AwsClientBuilder; 21import com.amazonaws.services.s3.AmazonS3; 22import com.amazonaws.services.s3.AmazonS3ClientBuilder; 23 24@WebServlet("/Upload") 25@MultipartConfig 26public class UploadServlet extends HttpServlet { 27 28 protected void doPost(HttpServletRequest request, HttpServletResponse response) 29 throws ServletException, IOException { 30 doGet(request, response); 31 response.setContentType("text/html;charset=UTF-8"); 32 PrintWriter out = response.getWriter(); 33 34 try { 35 // アップロードされたファイルの取得 36 Part filePart = request.getPart("file"); 37 String fileName = getSubmittedFileName(filePart); 38 39 // アップロードされたファイルをサーバーの一時ディレクトリに保存 40 String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads"; 41 File uploadDir = new File(uploadPath); 42 if (!uploadDir.exists()) { 43 uploadDir.mkdir(); 44 } 45 String filePath = uploadPath + File.separator + fileName; 46 filePart.write(filePath); 47 48 // プロパティファイルからAWSアクセスキー、シークレットキー、S3バケット名、ファイルのキーを読み込む 49 Properties props = new Properties(); 50 try (InputStream input = new FileInputStream("config.properties")) { 51 props.load(input); 52 } catch (IOException e) { 53 // e.printStackTrace(); 54 out.println("エラーが発生しました: " + e.getMessage()); 55 return; 56 } 57 // プロパティよりAWSのアクセスキーとシークレットアクセスキーを取得 58 String accessKey = props.getProperty("accessKey"); 59 String secretKey = props.getProperty("secretKey"); 60 61 // プロパティよりS3のバケット名とファイルキーを取得 62 String bucketName = props.getProperty("bucketName"); 63 String s3Key = props.getProperty("s3Key" + fileName); 64 65 // AWS S3クライアントを作成 66 BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); 67 AmazonS3 s3Client = AmazonS3ClientBuilder.standard() 68 .withCredentials(new AWSStaticCredentialsProvider(credentials)) 69 .withEndpointConfiguration( 70 new AwsClientBuilder.EndpointConfiguration(props.getProperty("endpointURL"), 71 props.getProperty("region"))) 72 .build(); 73 74 // アップロードするファイルとバケット名を指定 75 File file = new File(filePath); 76 77 // S3にファイルをアップロード 78 s3Client.putObject(bucketName, s3Key, file); 79 80 // レスポンスに成功メッセージを出力 81 out.println("ファイルのアップロードが成功しました!"); 82 83 } catch (IOException | ServletException e) { 84 out.println("エラーが発生しました: " + e.getMessage()); 85 } 86 } 87 88 /** 89 * 90 */ 91 protected void doGet(HttpServletRequest request, HttpServletResponse response) 92 throws ServletException, IOException { 93 doPost(request, response); 94 } 95 96 // パートからファイル名を取得するユーティリティメソッド 97 private String getSubmittedFileName(Part part) { 98 for (String cd : part.getHeader("content-disposition").split(";")) { 99 if (cd.trim().startsWith("filename")) { 100 String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", ""); 101 return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); 102 } 103 } 104 return null; // ファイル名が見つからない場合はnullを返す 105 } 106} 107
web.xml
1<!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5<web-app> 6 <display-name>Archetype Created Web Application</display-name> 7 <welcome-file-list> 8 <welcome-file>upload.jsp</welcome-file> 9 </welcome-file-list> 10</web-app>
upload.jsp
1<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2<!DOCTYPE html> 3<html> 4<head> 5<title>ファイルアップロード</title> 6</head> 7<body> 8 <h2>ファイルをアップロードする</h2> 9 <form action="/Upload" method="post" enctype="multipart/form-data"> 10 <input type="file" name="file" /> <br /> <input type="submit" 11 value="アップロード" /> 12 </form> 13</body> 14</html> 15
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
サーバー起動時の画面
アップデートボタン押下後のエラー画面
javaファイル内でアノテーション、web.xmlでservletマッピングを行っていた為、jspファイルも表示されませんでしたが、web.xml内の記載を削除することでjspは表示されるようになった。
ファイルの配置構成を見直した
補足
特になし
