検索
ホームページJava&#&チュートリアルJavaとWebUploaderを組み合わせたファイルアップロード機能コードの詳細説明

この記事では主に、Java と WebUploader を組み合わせて ファイル upload 関数を実装する方法を紹介します。コードはシンプルで簡単です。理解しました、とても良いです、それを必要とする友人はそれを参照できます

私も以前小さなプロジェクトを書いていたときにファイルのアップロードの問題に遭遇しましたが、良い解決策が見つかりませんでした。以前に WebUploader を試してみましたが、それ以上詳しくは調べませんでした。ここでは、簡単なファイルと通常のデータのアップロードと保存について説明します

jspページ:

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
  文件:<input type="file" value="请选择文件" name="file" /> <br/>
  信息:<input type="text" name="info" /> <br/>
  <input type="submit" value="提交" />
 </form>
</body>
</html>

サーブレット:

package com.yihengliu.web.action;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
/**
 * Servlet user to accept file upload
 */
public class FileUploadServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 private String serverPath = "e:/";
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  response.getWriter().append("Served at: ").append(request.getContextPath());
  System.out.println("进入后台...");
  // 1.创建DiskFileItemFactory对象,配置缓存用
  DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
  // 2. 创建 ServletFileUpload对象
  ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
  // 3. 设置文件名称编码
  servletFileUpload.setHeaderEncoding("utf-8");
  // 4. 开始解析文件
  try {
   List<FileItem> items = servletFileUpload.parseRequest(request);
   for (FileItem fileItem : items) {
    if (fileItem.isFormField()) { // >> 普通数据
     String info = fileItem.getString("utf-8");
     System.out.println("info:" + info);
    } else { // >> 文件
     // 1. 获取文件名称
     String name = fileItem.getName();
     // 2. 获取文件的实际内容
     InputStream is = fileItem.getInputStream();
     // 3. 保存文件
     FileUtils.copyInputStreamToFile(is, new File(serverPath + "/" + name));
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
 }
}

WebUploaderコンポーネントを使用してアップロードシャーディング、同時実行、プレビュー、圧縮、フォルダーを追加する複数の方法(複数のファイル選択、ドラッグしてドロップなど)、素晴らしいヒント

ページスタイルの使用法

<html>
<title>使用webuploader上传</title>
<!-- 1.引入文件 -->
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/js/webuploader.css" rel="external nofollow" >
<script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/js/webuploader.js"></script>
</head>
<body>
 <!-- 2.创建页面元素 -->
 <p id="upload">
  <p id="filePicker">文件上传</p>
 </p>
 <!-- 3.添加js代码 -->
 <script type="text/javascript">
  var uploader = WebUploader.create(
   {
    swf:"${pageContext.request.contextPath }/js/Uploader.swf",
    server:"${pageContext.request.contextPath }/FileUploadServlet",
    pick:"#filePicker",
    auto:true
   }  
  );
 </script>
</body>
</html>

    ファイル名リストの生成、アップロードの進行状況をリアルタイムで表示、
  • サムネイルの表示

  • ファイルリストの追加p、
  • <p id="fileList"></p>

  • サムネイルを生成し、アップロードの進行状況を表示します
  • // 生成缩略图和上传进度
    uploader.on("fileQueued", function(file) {
      // 把文件信息追加到fileList的p中
      $("#fileList").append("<p id=&#39;" + file.id + "&#39;><img / alt="JavaとWebUploaderを組み合わせたファイルアップロード機能コードの詳細説明" ><span>" + file.name + "</span><p><span class=&#39;percentage&#39;><span></p></p>")
      // 制作缩略图
      // error:不是图片,则有error
      // src:代表生成缩略图的地址
      uploader.makeThumb(file, function(error, src) {
       if (error) {
        $("#" + file.id).find("img").replaceWith("<span>无法预览 </span>");
       } else {
        $("#" + file.id).find("img").attr("src", src);
       }
      });
     }
    );
    // 监控上传进度
    // percentage:代表上传文件的百分比
    uploader.on("uploadProgress", function(file, percentage) {
     $("#" + file.id).find("span.percentage").text(Math.round(percentage * 100) + "%");
    });
    ドラッグしてアップロードし、貼り付けてアップロードします
  • ドラッグエリアを作成し、スタイルを設定します:
  • <style type="text/css">
     #dndArea {
      width: 200px;
      height: 100px;
      border-color: red;
      border-style: dashed;
     }
    </style>  
    <!-- 创建用于拖拽的区域 -->
    <p id="dndArea"></p>
    dndエリア構成を追加します(ドラッグアンドドロップを有効にします)基本構成では
  • ドラッグエリアの外側の応答をシールドします

貼り付け機能を有効にします

var uploader = WebUploader.create(
 {  swf:"${pageContext.request.contextPath }/js/Uploader.swf",
server:"${pageContext.request.contextPath }/FileUploadServlet",
  pick:"#filePicker",
  auto:true,
  // 开启拖拽
  dnd:"#dndArea",
  // 屏蔽拖拽区域外的响应
  disableGlobalDnd:true,
  // 
 }  
);

    ファイルのアップロードをブロックします
  • フロントエンドはファイルに基づいて
md5

文字列を生成しますこれを送信する必要があり、それをバックエンドに送信すると、バックエンドは md5 文字列に基づいて名前を付けたフォルダーを作成し、ファイルを受信した後、ファイル ブロックのシリアル番号をバックエンドに送信します。フロントエンドが送信された後、バックエンドはファイルをマージするようにバックエンドに通知します。 、など。

// 上传基本配置
var uploader = WebUploader.create(
{
 swf:"${pageContext.request.contextPath }/js/Uploader.swf",
 server:"${pageContext.request.contextPath }/FileUploadServlet",
 pick:"#filePicker",
 auto:true,
 dnd:"#dndArea",
 disableGlobalDnd:true,
 paste:"#uploader",

 // 分块上传设置
 // 是否分块
 chunked:true,
 // 每块文件大小(默认5M)
 chunkSize:5*1024*1024,
 // 开启几个并非线程(默认3个)
 threads:3,
 // 在上传当前文件时,准备好下一个文件
 prepareNextFile:true
}  
);

フロントエンド監視ブロック
  • は、次の 3 つの時点に分けることができます:
  • before-send-file: このメソッドは、ファイルがアップロードされる前に呼び出されます (ファイルがアップロードされる前にのみ呼び出されます)。 1 つのファイルがアップロードされます)。

    バックグラウンドでチャンク ファイルを保存するためのディレクトリ名として、このメソッドでファイルの md5 文字列を取得できます。

before-send: このメソッドは、各チャンク ファイルがアップロードされる前に呼び出されます。 (各チャンクファイルがアップロードされる前に呼び出されます)。
  • このメソッドでは md5 文字列をバックグラウンドに送信でき、バックグラウンドはブロックが既に存在するかどうかを判断し、再開の機能を実現するためにブロックを送信するかどうかを決定します。ブレークポイント後の送信

after-send-file: このメソッドは、ファイルのアップロードがエラーなく完了した後に呼び出されます (すべての部分的なアップロードが完了した後に呼び出されます)
  • バックグラウンドに通知できます。このメソッドですべてのチャンクをマージします

フロントエンドはファイルの md5 文字列を取得し、各チャンクが送信されるときにそれを送信します。バックグラウンドに移動し、フォルダーが存在しない場合は受信し、フォルダーを作成して、送信されたファイルを保存します。チャンクで
  •  // 监听分块上传的时间点,断点续传
    var fileMd5;
    WebUploader.Uploader.register({
     "before-send-file":"beforeSendFile",
     "before-send":"beforeSend",
     "after-send-file":"afterSendFile"
     },{
      beforeSendFile:function(file) {
       // 创建一个deffered,用于通知是否完成操作
       var deferred = WebUploader.Deferred();
       // 计算文件的唯一标识,用于断点续传和妙传
       (new WebUploader.Uploader()).md5File(file, 0, 5*1024*1024)
        .progress(function(percentage){
         $("#"+file.id).find("span.state").text("正在获取文件信息...");
        })
        .then(function(val) {
         fileMd5 = val;
         $("#" + file.id).find("span.state").text("成功获取文件信息");
         // 放行
         deferred.resolve();
        });
       // 通知完成操作
       return deferred.promise();
      },
      beforeSend:function() {
       var deferred = WebUploader.Deferred();
       // 发送文件md5字符串到后台
       this.owner.options.formData.fileMd5 = fileMd5;
       deferred.resolve();
       return deferred.promise();
      },
      afterSendFile:function() {
      }
     }
    );

    状態タグを追加します
  • $("#fileList").append("<p id=&#39;" + file.id + "&#39;>
    <img / alt="JavaとWebUploaderを組み合わせたファイルアップロード機能コードの詳細説明" >
    <span>" + file.name + "</span>
    <p>
    <span class=&#39;state&#39;>
    </span>
    </p>
    <p>
    <span class=&#39;percentage&#39;>
    </span>
    </p>
    </p>");
ファイルを保存します

// 4. 开始解析文件
// 文件md5获取的字符串
String fileMd5 = null;
// 文件的索引
String chunk = null;
try {
  List<FileItem> items = servletFileUpload.parseRequest(request);
  for (FileItem fileItem : items) {
    if (fileItem.isFormField()) { // >> 普通数据
      String fieldName = fileItem.getFieldName();
      if ("info".equals(fieldName)) {
        String info = fileItem.getString("utf-8");
        System.out.println("info:" + info);
      }
      if ("fileMd5".equals(fieldName)) {
        fileMd5 = fileItem.getString("utf-8");
        System.out.println("fileMd5:" + fileMd5);
      }
      if ("chunk".equals(fieldName)) {
        chunk = fileItem.getString("utf-8");
        System.out.println("chunk:" + chunk);
      }
    } else { // >> 文件
      /*// 1. 获取文件名称
      String name = fileItem.getName();
      // 2. 获取文件的实际内容
      InputStream is = fileItem.getInputStream();
      // 3. 保存文件
      FileUtils.copyInputStreamToFile(is, new File(serverPath + "/" + name));*/
      // 如果文件夹没有创建文件夹
      File file = new File(serverPath + "/" + fileMd5);
      if (!file.exists()) {
        file.mkdirs();
      }
      // 保存文件
      File chunkFile = new File(serverPath + "/" + fileMd5 + "/" + chunk);
      FileUtils.copyInputStreamToFile(fileItem.getInputStream(), chunkFile);
    }
  }

  • フロントエンドはファイルをマージするアクションを通知します

フロントエンドが追加されます:

// 通知合并分块
$.ajax(
  {
    type:"POST",
    url:"${pageContext.request.contextPath}/UploadActionServlet?action=mergeChunks",
    data:{
      fileMd5:fileMd5
    },
    success:function(response){
    }
  }
);

New

mergeアクション:
    package com.yihengliu.web.action;
    import java.io.File;
    import java.io.FileFilter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.nio.channels.FileChannel;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.UUID;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * 合并上传文件
     */
    public class UploadActionServlet extends HttpServlet {
      private static final long serialVersionUID = 1L;
      private String serverPath = "e:/";
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
        System.out.println("进入合并后台...");
        String action = request.getParameter("action");
        if ("mergeChunks".equals(action)) {
          // 获得需要合并的目录
          String fileMd5 = request.getParameter("fileMd5");
          // 读取目录所有文件
          File f = new File(serverPath + "/" + fileMd5);
          File[] fileArray = f.listFiles(new FileFilter() {
            // 排除目录,只要文件
            @Override
            public boolean accept(File pathname) {
              if (pathname.isDirectory()) {
                return false;
              }
              return true;
            }
          });
          // 转成集合,便于排序
          List<File> fileList = new ArrayList<File>(Arrays.asList(fileArray));
          // 从小到大排序
          Collections.sort(fileList, new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
              if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
                return -1;
              }
              return 1;
            }
          });
          // 新建保存文件
          File outputFile = new File(serverPath + "/" + UUID.randomUUID().toString() + ".zip");
          // 创建文件
          outputFile.createNewFile();
          // 输出流
          FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
          FileChannel outChannel = fileOutputStream.getChannel();
          // 合并
          FileChannel inChannel;
          for (File file : fileList) {
            inChannel = new FileInputStream(file).getChannel();
            inChannel.transferTo(0, inChannel.size(), outChannel);
            inChannel.close();
            // 删除分片
            file.delete();
          }
          // 关闭流
          fileOutputStream.close();
          outChannel.close();
          // 清除文件加
          File tempFile = new File(serverPath + "/" + fileMd5);
          if (tempFile.isDirectory() && tempFile.exists()) {
            tempFile.delete();
          }
          System.out.println("合并文件成功");
        }
      }
      protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
        doGet(request, response);
      }
    }
  • ブレークポイントを再開

フロントエンドページを送信する前に検証を追加して、チャンクがアップロードされたかどうかを確認します

beforeSend:function(block) {
        var deferred = WebUploader.Deferred();
        // 支持断点续传,发送到后台判断是否已经上传过
        $.ajax(
          {
            type:"POST",
            url:"${pageContext.request.contextPath}/UploadActionServlet?action=checkChunk",
            data:{
              // 文件唯一表示                
              fileMd5:fileMd5,
              // 当前分块下标
              chunk:block.chunk,
              // 当前分块大小
              chunkSize:block.end-block.start
            },
            dataType:"json",
            success:function(response) {
              if(response.ifExist) {
                // 分块存在,跳过该分块
                deferred.reject();
              } else {
                // 分块不存在或不完整,重新发送
                deferred.resolve();
              }
            }
          }
        );
        // 发送文件md5字符串到后台
        this.owner.options.formData.fileMd5 = fileMd5;
        return deferred.promise();
      }

検証を追加
  • else if ("checkChunk".equals(action)) {
        // 校验文件是否已经上传并返回结果给前端
        // 文件唯一表示                
        String fileMd5 = request.getParameter("fileMd5");
        // 当前分块下标
        String chunk = request.getParameter("chunk");
        // 当前分块大小
        String chunkSize = request.getParameter("chunkSize");
        // 找到分块文件
        File checkFile = new File(serverPath + "/" + fileMd5 + "/" + chunk);
        // 检查文件是否存在,且大小一致
        response.setContentType("text/html;charset=utf-8");
        if (checkFile.exists() && checkFile.length() == Integer.parseInt((chunkSize))) {
          response.getWriter().write("{\"ifExist\":1}");
        } else {
          response.getWriter().write("{\"ifExist\":0}");
        }
      }

以上がJavaとWebUploaderを組み合わせたファイルアップロード機能コードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。