WebUploaderを使って断片アップロードのファイル機能を実現する(二)


前に書く:
ここ数日、WebUploaderのアップロードファイルを研究しに行きました。前のブログにWebUploaderを使って簡単にファイルをアップロードするという記録があります。今日は断片アップロードの例も記録してください。ブログの中で資料も調べました。基本的にはバックグラウンドでデータを処理するときに使うServlet、あるいはSpringMVCです。最近のプロジェクトはずっとStrutsです。だからここでは、Struts 2のactionでデータを処理して、ファイルを分割アップロードする効果があります。
1.何がスライスアップロードですか?
名前の通り、ファイルを一枚に分割して、一つのファイルをいくつかの小さなファイルに分割して、またアップロードします。このようにするメリットは大きいファイルをアップロードするのに便利です。
2.スライスアップロードの大まかな構想:
1.フロントページで、ファイルを選択し、ボタンをクリックしてアップロードします。
2.WebUploaderはアップロードされたファイルを指定された個数に分割してサービスエンドのバックグラウンドに送信する。
3.サーバーは分割後の小さいファイルを受信し、一時フォルダに保存します。
4.サーバーが分割後の小さいファイルを受信したら、フロントページでアップロード成功関数を実行します。
5.アップロード成功関数でサーバに要求を送り、小さいファイルを一つの全体として統合することを要求します。
6.サーバのバックグラウンドでファイルをマージし、マージが完了したら、小さいファイルを保存する一時ファイルを削除します。 
スライスアップロードの大体の過程を了解しました。直接デモに行きましょう。
フロントページ:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
  String scheme = request.getScheme();
  String serverName = request.getServerName();
  String contextPath = request.getContextPath();
  int port = request.getServerPort();

  //        
  String baseURL = scheme + "://" + serverName + ":" + port
      + contextPath;
  request.setAttribute("baseURL", baseURL);
%>
<html>
<head>
  <title>WebUploader          </title>
  <%--  css  --%>
  <link href="${baseURL}/webuploader0.1.5/webuploader.css" rel="external nofollow" rel="stylesheet" type="text/css"/>
  <script src="${baseURL}/ligerui2/jquery/jquery-1.9.0.min.js" type="text/javascript"></script>
  <%--        --%>
  <script type="text/javascript" src="${baseURL}/webuploader0.1.5/webuploader.min.js"></script>

  <script type="text/javascript">

      $(function(){
        /*
          uploader   ,   dom        div        ,             ,
               ,          ,     $(function(){}     */
        var uploader = WebUploader.create({

          // swf    
          swf: '${baseURL}/webuploader0.1.5/Uploader.swf',
          //          。
          server: '${baseURL}/uploadFile2',
          // [   :'file']         name。
          fileVal:'upload',
          //        。  。
          //            ,   input  ,    flash.
          pick:
            {
              multiple: false,
              id: '#filePicker'
            },

          //      。           [   :3]        
          /*                                                         
                                   webuploader              3 
                             ,      1*/
          threads: 1,

          //            
          auto: false,
          //            。
          chunked: true,
          //      ,     ?      5M.
          chunkSize: 5 * 1024 * 1024,
          //    image,      jpeg,             !
          resize: false,
          formData: {
            guid: Math.random() //                   
              }
        });


        //           
        uploader.on('fileQueued', function (file) {

          //           
          $("#fileList").html("");

          //                          
          $one = $("<div id='"+file.id+"'>"+file.name+"</div>");
          $two = $("<div id='state'>    ......</div>");
          $("#fileList").append($one);
          $("#fileList").append($two);

          });


        //                 。
        uploader.on('uploadProgress', function (file, percentage) {
          //     ...
          console.log("uploadProgress===="+percentage);
          $("#state").text("     ...");

        });

        //         。
        uploader.on('uploadSuccess', function (file, response) {
          //     ...
          console.log('upload success...
'); console.log(uploader.options.formData.guid); console.log(file.name); // $.post( "${baseURL}/mergeFile", // { guid: uploader.options.formData.guid, chunks: Math.ceil(file.size / (5 * 1024 * 1024)), fileName: file.name }, function(data){ }); $("#state").text(" ~~~"); }); // 。 uploader.on('uploadError', function (file) { // ... }); // , , uploader.on('uploadComplete', function (file) { // ... }); // $("#btnClick").click(function(){ uploader.upload(); }); // $("#btnCancel").click(function(){ // .. }); }); </script> </head> <body style="padding:10px"> <div id="layout1"> <div id="uploader-demo"> <div id="fileList" ></div> <div id="filePicker" > </div> <button id="btnClick"> </button> <button id="btnCancel"> </button> </div> </div> </body> </html>
バックグラウンドaction:

/**
 * Description:com.ims.action
 * Author: Eleven
 * Date: 2017/12/26 10:50
 */
@Controller("FileAction")
public class FileAction {

  /*                   */
  //       get set  
  //      (   type=file name   )
  private File upload;
  //   
  private String uploadFileName;
  //    
  private String uploadContentType;

  /**
   *       public,    ,    private   get,set   ,
   *         public 
   */
  //      
  public String chunk;

  public String guid;//         

  //               
  public String fileName; //   
  public String chunks; //    


  //            ,                ,                
  public void uploadFile2() throws Exception{
    String str = "D:/upload44/divide/"; //      
    //          
    String realPath = str + guid +"/" + chunk;
    File tmp =new File(realPath);
    FileUtils.copyFile(upload, tmp);
    System.out.println("    "+uploadFileName+",   :"+chunk+",  :"+(upload.length()/1024/1024)+"M");

  }


  //    
  public void mergeFile() throws Exception{

    String path = "D:/upload44/merge/" ;
    //        
    new File(path).mkdir();

    //         
    File newFile = new File(path + fileName);
    if(!newFile.exists()){
      newFile.createNewFile();
    }

    FileOutputStream outputStream = new FileOutputStream(newFile, true);//      

    byte[] byt = new byte[10 * 1024 * 1024];
    int len;
    FileInputStream temp = null;//    
    for (int i = 0; i < Integer.parseInt(chunks); i++) {
      //"D:/upload44/divide/" + guid + "/" + i              
      temp = new FileInputStream(new File("D:/upload44/divide/" + guid + "/" + i));
      while ((len = temp.read(byt)) != -1) {
        System.out.println(len);
        outputStream.write(byt, 0, len);

      }
      temp.close();
    }

     //                 
    outputStream.close();

    //      
    String path2 = "D:/upload44/divide/" + guid;
    FileUtils.deleteDirectory(new File(path2));//          

    System.out.println("success!guid=" + guid + ";chunks=" + chunks + ";fileName=" + fileName);

  }  

  public File getUpload() {
    return upload;
  }

  public void setUpload(File upload) {
    this.upload = upload;
  }

  public String getUploadFileName() {
    return uploadFileName;
  }

  public void setUploadFileName(String uploadFileName) {
    this.uploadFileName = uploadFileName;
  }

  public String getUploadContentType() {
    return uploadContentType;
  }

  public void setUploadContentType(String uploadContentType) {
    this.uploadContentType = uploadContentType;
  }
}

struts.xml設定:

<action name="uploadFile2" class="FileAction" method="uploadFile2">
</action>
<action name="mergeFile" class="FileAction" method="mergeFile">
</action>
はい、ここで簡単なファイルを断片的にアップロードしたら完成です。
ところで、補足説明では、バックグラウンドは簡単なパラメータだけを受け取っています。フロントからWebUploaderが伝えてきたパラメータは上記の数だけではないです。だから、F 12でデバッグモードをマスターして、送信の要求を確認してください。また、関連する要求パラメータはここでは多くありません。
実行スクリーンショット:

以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。