javaはファイルアップロード機能を実現します。


本論文の例では、Javaのファイルアップロードを実現するための具体的なコードを共有します。
一、ファイルアップロード準備作業
ファイルのアップロードに対しては、ブラウザはアップロード中にファイルをストリーミング形式でサーバに提出します。
apacheのcommons-fileupladパッケージをファイルアップロードのコンポーネントとして選択できます。comons-fileupledパッケージはcommons-ioパッケージに依存します。
Mavenでこのcommons-fileupladバッグを導入してもいいです。Mavenは私たちに依頼しているjarカバンのcommons-iを導入してくれます。

<dependency>
 <groupId>commons-fileupload</groupId>
 <artifactId>commons-fileupload</artifactId>
 <version>1.3.3</version>
</dependency>
二、ファイルアップロードの主なステップ
  • は、disk FileItem Factoryオブジェクトを作成し、ファイルのアップロード経路またはサイズ制限
  • を処理する。
  • は、disk FileItem Factoryオブジェクトを介してServlet FileUpload類のパラメータとして、Servlet FileUploadオブジェクト
  • を作成する。
  • アップロードされたファイルを処理する
  • 三、コード実現
    ファイルをアップロードする時、フォームは必ずenctype=「multiiPad/form-data」を追加します。enctype=「multiipad/form-data」を使うだけで、フォームはファイルの内容をHTML要求にエンコードします。
    デフォルトのenctype=「appication/x-www-form-urlencoded」では、フォームの内容はURLルールでエンコードされます。
    enctype=「multiipad/form-data」は文字コードではありません。ファイルアップロードコントロールを含むフォームを使用するには、この値が必要です。
    methodも必ずpostを使ってお願いします。
    
    <form action="/file.do" enctype="multipart/form-data" method="post">
     <p>    :<input type="text" name="username"></p>
     <p><input type="file" name="file1"></p>
     <p><input type="file" name="file2"></p>
     <p><input type="submit">|<input type="reset"></p>
    </form>
    
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     //                  
     if (!ServletFileUpload.isMultipartContent(req)) {
      return;
     }
     //           ,     WEB-INF   ,               
     String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
     File uploadFile = new File(uploadPath);
     //        ,     
     if (!uploadFile.exists()) {
      uploadFile.mkdir();
     }
    
     //            ,         ,                
     //      WEB-INF   ,               
     String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
     File tempFile = new File(tempPath);
     //        ,     
     if (!tempFile.exists()) {
      tempFile.mkdir();
     }
    
     //1.  diskFileItemFactory  ,              
     DiskFileItemFactory factory = getDiskFileItemFactory(tempFile);
    
     //2.  ServletFileUpload
     ServletFileUpload upload = getServletFileUpload(factory);
    
     //3.       
     try {
      String msg = uploadParseRequest(upload, req, uploadPath);
      //  
      req.setAttribute("msg",msg);
      req.getRequestDispatcher("info.jsp").forward(req, resp);
     } catch (FileUploadException e) {
      e.printStackTrace();
     }
     }
    
    
     public DiskFileItemFactory getDiskFileItemFactory(File file) {
     DiskFileItemFactory factory = new DiskFileItemFactory();
     //       ,              ,          
     factory.setSizeThreshold(1024 * 1024);//      1M
     factory.setRepository(file);//    
     return factory;
     }
    
     public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {
     ServletFileUpload upload = new ServletFileUpload(factory);
     //        
     upload.setProgressListener(new ProgressListener() {
      @Override
      public void update(long uploaded, long totalSize, int i) {
      System.out.println("   :"+(uploaded*100)/totalSize+"%");
      }
     });
     upload.setHeaderEncoding("UTF-8");//    
     upload.setFileSizeMax(1024 * 1024 * 10);//          10M
     upload.setSizeMax(1024 * 1024 * 100);//             100M
     return upload;
     }
    
     public String uploadParseRequest(ServletFileUpload upload, HttpServletRequest req, String uploadPath) throws FileUploadException, IOException {
     String msg = "";
     //       ,     List  
     List<FileItem> fileItems = upload.parseRequest(req);
     for (FileItem fileItem : fileItems) {
      if (fileItem.isFormField()) {//                     
      String name = fileItem.getName();//       name:username
      String value = fileItem.getString("UTF-8");//    
      System.out.println(name + ":" + value);
      } else {//        
      //==================    =====================
      String uploadFileName = fileItem.getName();//       name
      System.out.println("      :" + uploadFileName);
      if (uploadFileName.trim().equals("") || uploadFileName == null) {//          
       continue;
      }
      String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//   
      String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//     
      System.out.println("   :" + fileName + "--    :" + fileExtName);
      //==================    ==================
      String uuidPath = UUID.randomUUID().toString();
      //         
      String realPath = uploadPath + "/" + uuidPath;
      System.out.println("        :"+realPath);
      //            
      File realPathFile = new File(realPath);
      if (!realPathFile.exists()) {//        ,     
       realPathFile.mkdir();
      }
      //==================    ==================
      //        
      InputStream inputStream = fileItem.getInputStream();
      //         
      FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
      //       
      byte[] buffer = new byte[1024 * 1024];
      //        
      int len = 0;
      while ((len = inputStream.read(buffer)) > 0) {
       fileOutputStream.write(buffer, 0, len);
      }
      //   
      fileOutputStream.close();
      inputStream.close();
      msg = "    ";
      fileItem.delete();//    ,      
      }
     }
     return msg;
    }
    ファイルアップロードの注意事項
    1、サーバーの安全を保証するために、アップロードしたファイルは外部から直接アクセスできないディレクトリの下に置くべきです。例えば、WEB-INFディレクトリの下に置くべきです。
    2、ファイルの上書きを防ぐために、アップロードされたファイルのために一意のファイル名を作成します。(アップロードされたファイルごとにuuidまたはタイムスタンプの名前が付けられたフォルダを追加してもいいです。)
    3、アップロードファイルの最大値を制限する
    4、アップロードファイルの種類を制限し、アップロードファイルを受け取った時、その拡張子の名前が合法かどうかを判断し、自分で制限するタイプかを判断する。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。