1. ホーム
  2. Web プログラミング
  3. JSP プログラミング

サーバーへのファイルアップロード機能を実現するJSP+サーブレット

2022-01-19 09:09:25

この例では、サーバーにファイルをアップロードする機能を実現するためのJSP+Servletの具体的なコードを、参考までに以下のように共有します。

プロジェクトのディレクトリ構成は、おおよそ以下の通りです。

上の赤線に3つ描いたとおりです。Dao、service、servlet この3つの層は、MVCアーキテクチャに似たメイン構造で、Daoはモデルエンティティクラス(ロジック層)、serviceはサービス層、servletはビュー層で、この3つが連携してプロジェクトを完成させるのです。

ここで、ユーザーは、ユーザーテーブルによって定義されたクラスであり、その後、クエリと挿入、変更、削除操作を達成するためにデータベースから追加、削除などの操作をカプセル化し、ページング操作を達成するために、また、サーバー上の画像を実行する効果を達成するために。

Dao層:Userクラスの定義の主な実装、インターフェイスIUserDaoの定義と実装(UserDaoImpl)。

サービス層:IUserDaoと同様のインターフェースクラスIUserServiceを直接定義し、そのインターフェースクラスUserServiceImplを実装、UserDaoImplを直接インスタンス化し、そのメソッドを呼び出して独自のメソッドを実装、コードを再利用しています。詳しくはコードをご覧ください.

サーブレット層。当初、テーブルユーザーの各操作メソッドは、単純な、しかし、あまりにも多くの、管理するのは簡単ではないので、ベースクラスBaseServletの使用は、&quotを実装するために達成するためにサーブレットとして定義されて;反射機構&quotは、アクションパラメータを介して自分自身で取得インテリジェント呼び出しにベースクラスBaseServletが実装されていますquotを参照してください。 反射機構"インテリジェントに対応するメソッドを呼び出すために、それが取得するアクションパラメータによって、UserServletは、具体的にはるかに便利な呼び出しのための独自のメソッドを実装しながら、以前のブログ記事または詳細については、次のコードを参照してください。

tomcat サーバーにファイルをアップロードする際のポイントは、コンパイルのたびに、対応するアップロードファイルを格納するためのフォルダを手動で作成することです。そうしないと、tomcat サーバーを再起動するたびに、コンパイル済みのプロジェクトが元のプロジェクトに上書きされてしまい、結果としてアップロードファイルが格納されるフォルダが存在せず、コードがフォルダを見つけられずエラーを報告する、つまり、アップロードが成功しない、という事態が発生することになります。次の図のようになります。

主な考慮事項は、画像のパスですが、手動でパスを設定することは確かに繰り返さないことを保証することはできませんので、名前が繰り返されないように、画像名としてランダムに生成された乱数を使用した後にアップロードされた画像のサフィックス名を取ります:。

String extendedName = picturePath.substring(picturePath.lastIndexOf(". "),// Truncate the substring from the last '.' to the end of the string.
 picturePath.length());
 // Rename the file name to a globally unique file name
 String uniqueName = UUID.randomUUID().toString();
 saveFileName = uniqueName + extendedName;// splice pathname

ユーザーを追加する際のコードは以下の通りです。

 // increase
 public void add(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 System.out.println("add method was called");
 // Get the data
 int id = 0;
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 // Get if the form is submitted with enctype="multipart/form-data"
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
 // Get the file upload object via FileItemFactory
 FileItemFactory fif = new DiskFileItemFactory();
 ServletFileUpload upload = new ServletFileUpload(fif);
 
 try {
 List<FileItem> items = upload.parseRequest(request);
 for (FileItem item : items) {
 // Determine if it is a normal form control or a file upload form control
 boolean isForm = item.isFormField();
 if (isForm) {// is a normal form control
 String name = item.getFieldName();
 if ("id".equals(name)) {
 id = Integer.parseInt(item.getString("utf-8"));
 System.out.println(id);
 }
 if ("sex".equals(name)) {
 sex = item.getString("utf-8");
 System.out.println(sex);
 }
 if ("username".equals(name)) {
 username = item.getString("utf-8");
 System.out.println(username);
 }
 if ("password".equals(name)) {
 password = item.getString("utf-8");
 System.out.println(password);
 }
 if ("birthday".equals(name)) {
 String birthdayStr = item.getString("utf-8");
 SimpleDateFormat sdf = new SimpleDateFormat(
  "yyyy-MM-dd");
 try {
 birthday = sdf.parse(birthdayStr);
 } catch (ParseException e) {
 e.printStackTrace();
 }
 System.out.println(birthday);
 }
 if ("address".equals(name)) {
 address = item.getString("utf-8");
 System.out.println(address);
 }
 if ("picturePath".equals(name)) {
 picturePath = item.getString("utf-8");
 System.out.println(picturePath);
 }
 } else {// is a file upload form control
 // get the file name xxx.jpg
 String sourceFileName = item.getName();
 // get the extension of the file name: .jpg
 String extendedName = sourceFileName.substring(
 sourceFileName.lastIndexOf(". "),
 sourceFileName.length());
 // Rename the file name to a globally unique file name
 String uniqueName = UUID.randomUUID().toString();
 saveFileName = uniqueName + extendedName;
 // Get the path to the file uploaded to the server
 // C:\\apache-tomcat-7.0.47\\webapps\\\taobaoServlet4\\\\upload\\\xx.jpg
 String uploadFilePath = request.getSession()
 .getServletContext().getRealPath("upload/");
 File saveFile = new File(uploadFilePath, saveFileName);
 // Write out the saved file to the server's hard drive
 try {
 item.write(saveFile);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }
 } catch (NumberFormatException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (FileUploadException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 // 2. Wrapping data
 User user = new User(id, username, password, sex, birthday, address,
 saveFileName);
 // 3. Call the logic layer API
 IUserService iUserService = new UserServiceImpl();
 // 4. Control jumping
 HttpSession session = request.getSession();
 if (iUserService.save(user) > 0) {
 System.out.println("Added new user successfully! ");
 List<User> users = new ArrayList<User>();
 users = iUserService.listAll();
 session.setAttribute("users", users);
 response.sendRedirect("UserServlet?action=getPage");
 } else {
 System.out.println("Failed to add new user! ");
 PrintWriter out = response.getWriter();
 out.print("<script type='text/javascript'>");
 out.print("alert('Failed to add new user! Please try again!') ;");
 out.print("</script>");
 }
 }

ユーザーを変更する場合、画像が変更される場合とされない場合の2つのケースを考慮する必要があります。画像が変更された場合は、元の画像を取得してサーバーから削除してから新しい画像を追加し、画像が変更されていない場合は、画像パスを更新する必要はありません。

 // change
 public void update(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 System.out.println("update method was called");
 HttpSession session = request.getSession();
 // Get the data
 int id = (int)session.getAttribute("id");
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 IUserService iUserService = new UserServiceImpl();
 // Get whether the form is submitted with enctype="multipart/form-data"
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
 // Get the file upload object via FileItemFactory
 FileItemFactory fif = new DiskFileItemFactory();
 ServletFileUpload upload = new ServletFileUpload(fif);
 try {
 List<FileItem> items = upload.pa