实操——使用uploadify插件(php版和Java版) 与 Dropzone.js插件分别实现附件上传

news2024/11/21 2:30:29

实操——使用uploadify插件(php版和Java版)与 Dropzone.js插件分别实现附件上传

  • 1. 使用uploadify插件上传
    • 1.1 简介
      • 1.1.1 简介
      • 1.1.2 参考GitHub
    • 1.2 后端PHP版本的uploadify
      • 1.2.1 下载项目的目录结构
      • 1.2.2 测试看界面效果
      • 1.2.3 附页面代码 和 PHP代码
    • 1.3 后端Java版本的uploadify
      • 1.3.1 先看一下项目结构
      • 1.3.2 web.xml配置
      • 1.3.3 Java实现代码
      • 1.3.4 效果
    • 1.4 uploadify的优化一丢丢(不够完美)
      • 1.4.1 说明
      • 1.4.2 先看效果
      • 1.4.3 代码不同之处
  • 2. 使用Dropzone.js插件上传
    • 2.1 项目结构
    • 2.2 看效果
    • 2.3 核心代码
    • 2.4 参考
  • 3. 附项目下载
  • 4. 可能遇到问题
    • 4.1 idea中导入eclipse项目

1. 使用uploadify插件上传

1.1 简介

1.1.1 简介

  • uploadify是一个基于jQuery的文件上传插件,它提供了简单易用的界面和丰富的功能来实现文件上传操作。通过uploadify,用户可以选择文件并将其上传到服务器上。
  • uploadify具有以下特点:
    多文件上传、文件类型限制、文件大小限制、进度显示、事件回调(提供了多个事件回调函数,例如上传成功、上传失败等,方便开发者进行相应的处理)、自定义样式等。

1.1.2 参考GitHub

  • 原PHP项目如下(如果有PHP环境,原作者的项目下载下来即可运行,支持):
    https://github.com/Double-Lv/Huploadify.

1.2 后端PHP版本的uploadify

1.2.1 下载项目的目录结构

  • 下载地址就是上面参考的GitHub地址,项目目录如下:
    在这里插入图片描述

1.2.2 测试看界面效果

  • 下载之后放到PHP环境的某一站点下,直接运行即可,如下:
    在这里插入图片描述

1.2.3 附页面代码 和 PHP代码

  • demo.html
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <link rel="stylesheet" type="text/css" href="Huploadify.css"/>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript" src="jquery.Huploadify.js"></script>
    <style type="text/css">
    </style>
    <script type="text/javascript">
    $(function(){
    	var up = $('#upload').Huploadify({
    		// formData:{key:123456,key2:'vvvv'},
    		auto:false,
    		// fileTypeExts:'*.*',
    		fileTypeExts:'*.jpg;*.jpge;*.gif;*.png;*.jpeg;*.txt;*.doc;*.docx;*.pdf;*.xls;*.xlsx;*.ppt;*.pptx;*.zip,',
    		multi:true,
    		fileSizeLimit:99999999999,
    		showUploadedPercent:true,
    		showUploadedSize:true,
    		removeTimeout:9999999,
    		uploader:'upload.php',
    		
    		onUploadStart:function(file){
    			console.log(file.name+'开始上传');
    		},
    		onInit:function(obj){
    			console.log('初始化');
    			console.log(obj);
    		},
    		onUploadComplete:function(file){
    			console.log(file.name+'上传完成');
    		},
    		onCancel:function(file){
    			console.log(file.name+'删除成功');
    		},
    		onClearQueue:function(queueItemCount){
    			console.log('有'+queueItemCount+'个文件被删除了');
    		},
    		onDestroy:function(){
    			console.log('destroyed!');
    		},
    		onSelect:function(file){
    			console.log(file.name+'加入上传队列');
    		},
    		onQueueComplete:function(queueData){
    			console.log('队列中的文件全部上传完成',queueData);
    		}
    	});
    
    });
    </script>
    </head>
    
    <body>
    
    	<div id="upload"></div>
    
    </body>
    </html>
    
    
  • upload.php
    <?php
      $filename = iconv('UTF-8', 'GBK', $_FILES['file']['name']); 
      $key = $_POST['key'];
      $key2 = $_POST['key2'];
      // echo $key;
      // echo $key2;
      // echo $filename;
      // echo "aaaa";
      if ($filename) {
          move_uploaded_file($_FILES["file"]["tmp_name"],"upload_images/" . $filename);
      }
    
    ?>
    

1.3 后端Java版本的uploadify

1.3.1 先看一下项目结构

  • 这个项目里除了使用uploadify插件上传,还有包含了适用dropzone插件上传,先介绍uploadify,后面再说dropzone,结构如下(除了后端实现换成了Java,html页面几乎一样,js、css都是不变):
    在这里插入图片描述

1.3.2 web.xml配置

  • 如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             id="WebApp_ID" version="2.5">
    
      <display-name>dropzone_upload</display-name>
    
      <servlet>
        <servlet-name>uploadifyUpload</servlet-name>
        <servlet-class>uploadify.UploadFileServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>uploadifyUpload</servlet-name>
        <url-pattern>/uploadifyUpload</url-pattern>
      </servlet-mapping>
    
      <servlet>
        <servlet-name>showUploadifyFile</servlet-name>
        <servlet-class>uploadify.ShowFileServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>showUploadifyFile</servlet-name>
        <url-pattern>/showUploadifyFile</url-pattern>
      </servlet-mapping>
    
      <welcome-file-list>
    
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
    
        <welcome-file>dropzone_index.html</welcome-file>
        <welcome-file>uploadify_demo.html</welcome-file>
        <welcome-file>uploadify_demo_2.html</welcome-file>
    
      </welcome-file-list>
    
    </web-app>
    

1.3.3 Java实现代码

  • UploadFileServlet.java 如下:
    package uploadify;
    
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.Iterator;
    import java.util.List;
    import java.util.UUID;
    
    /**
     * @Description 使用 uploadify 实现附件上传
     * @Author susu
     */
    public class UploadFileServlet extends HttpServlet {
        private static final long serialVersionUID = 7434128027715196789L;
    
        // 上传文件保存路径
        private String uploadifyUploadPath = "/Users/susu/file_test/file_upload/uploadify_upload";
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            String ret_fileName = null; //返回给前端已修改的图片名称
    
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
    
            String tempPath = this.getServletContext().getRealPath("/");
    
            File dirFile = new File(uploadifyUploadPath);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
    
            File dirTempFile = new File(tempPath);
            if (!dirTempFile.exists()) {
                dirTempFile.mkdirs();
            }
    
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(20 * 1024 * 1024); // 设定使用内存超过5M时,将产生临时文件并存储于临时目录中。
            factory.setRepository(new File(tempPath));  // 设定存储临时文件的目录。
    
            ServletFileUpload upload = new ServletFileUpload(factory);
            upload.setHeaderEncoding("UTF-8");
    
            try {
                List<?> items = upload.parseRequest(request);
                Iterator<?> itr = items.iterator();
    
                while (itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    String fileName = item.getName();
                    if (fileName != null) {
                        String endstr = fileName.substring(fileName.indexOf("."), fileName.length());
                        fileName = UUID.randomUUID() + endstr;
                        ret_fileName = fileName;
                    }
                    if (!item.isFormField()) {
    
                        try {
                            File uploadedFile = new File(uploadifyUploadPath, fileName);
    
                            OutputStream os = new FileOutputStream(uploadedFile);
                            InputStream is = item.getInputStream();
                            byte buf[] = new byte[1024];
                            int length = 0;
                            while ((length = is.read(buf)) > 0) {
                                os.write(buf, 0, length);
                            }
    
                            os.flush();
                            os.close();
                            is.close();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
    
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
    
            //将已修改的图片名称返回前端
            out.print(ret_fileName);
            out.flush();
            out.close();
        }
    
    }
    
  • 参考如下:
    Uploadify v3.2.1 上传图片并预览.

1.3.4 效果

  • 如下:
    在这里插入图片描述
    在这里插入图片描述

1.4 uploadify的优化一丢丢(不够完美)

1.4.1 说明

  • 下面优化不够完美,只能说可以往这个方向优化,下面只是一个demo,如果上述已经满足你可以不用看下面的,因为如果实现完美可能还需要你自己去优化!!!

1.4.2 先看效果

  • 效果就是如果上传的是图片可以展示在页面,但是问题是不够动态,不支持多张,所以后续的优化方向是无论是图片还是附件上传之后都可以展示缩略图,好了只是方向,需要的自己去优化吧,先看单个图片效果:
    在这里插入图片描述
    在这里插入图片描述

1.4.3 代码不同之处

  • html页面,因为目前实现的效果不是特别好,所以直接截图了,如下:
    在这里插入图片描述
    在这里插入图片描述
  • ShowFileServlet.java 如下:
    package uploadify;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    
    /**
     * @Description
     * @Author susu
     */
    public class ShowFileServlet extends HttpServlet {
    
        private static final long serialVersionUID = 2761789171087122738L;
        private String uploadifyUploadPath = "/Users/susu/file_test/file_upload/uploadify_upload";
    
        public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            String file = req.getParameter("file");
    
            File getFile = new File(uploadifyUploadPath + File.separator + file);
    
            FileInputStream fis = new FileInputStream(getFile);
            OutputStream os = resp.getOutputStream();
            try {
                byte[] bytes = new byte[1024 * 1024];
                while (fis.read(bytes) != -1)
                    os.write(bytes);
                os.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (os != null)
                    os.close();
                if (fis != null)
                    fis.close();
            }
    
        }
    
    }
    
    

2. 使用Dropzone.js插件上传

2.1 项目结构

  • 如下:
    在这里插入图片描述

2.2 看效果

  • 如下:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.3 核心代码

  • dropzone_index.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>dropzone上传插件测试</title>
    
        <!-- jquery -->
        <script type="text/javascript" src="${pageContext.request.contextPath }/static/dropzone/jquery-3.3.1.min.js"></script>
    
        <!-- 注意:引入dropzone的js和css文件最好放在同一个目录,不然的话,会出现各种错误 -->
        <script type="text/javascript" src="${pageContext.request.contextPath }/static/dropzone/dropzone.js"></script>
        <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/dropzone/dropzone.css">
    
        <style type="text/css">
            #dropzoneUploadForm {
                min-height: 200px;
                width: 800px;
            }
        </style>
    
        <script type="text/javascript">
            /* Dropzone上传插件配置 */
    
            var IsServerError = false;//服务器获取配置出错
            var fileList = new Array();
            var fileUploadingList = new Array();
            var fileUploadedPathsArray = new Array();//已上传的文件在服务器的路径集合;用于遇到异常时删除已上传的文件。(相当于回滚)
            var uploadFileArray = new Array();
            var xmlHttpRequestArray = new Array();
            Dropzone.options.dropzoneUploadForm = { //此处的"dropzoneUploadForm" 是dropzone的HTML元素ID的驼峰命名,比如<form id="my-form"></form>,那么此处应该写:Dropzone.options.myForm
                paramName: "myFile", //与后端实体里的 private FormFile myFile;对应,如果实体没有就不匹配,也可以放到下面的 "sending" 中
                params: { // 可传公共参数
                    key1: "value11",
                    key2: "value2"
                },
                maxFiles: 25, //最大上传数量
                maxFilesize: 20, // MB 单个文件大小上限
                filesizeBase: 1000,
                acceptedFiles: ".doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.zip,.rar,.7z,image/*,application/pdf",
                addRemoveLinks: true,
                clickable: true,
                autoProcessQueue: true, // true:自动上传,一次性上传parallelUploads个文件,上传成功后后面排队的其他队伍也会继续排队上传。false:关闭自动上传, 手动调度 ,但每次需要点击“上传”按钮才会触发上传,排队的其他文件不会自动上传。
                parallelUploads: 2, //最大并行处理量(一次同时上传的个数,不设置的话,默认:2个)
    
    
                /* 插件消息翻译 */
                dictInvalidFileType: '仅支持以下文件格式:.doc,.docx,.xls,.xlsx,.ppt,.pptx,.txt,.zip,.rar,.7z,image/*,application/pdf',
                dictFileTooBig: '上传失败:文件大小超出最大20M',
                dictMaxFilesExceeded: '上传失败:上传文件超出最大数量25',
                dictCancelUpload: '取消上传',
                dictRemoveFile: '移除文件',
                dictCancelUploadConfirmation: '确认取消上传',
                dictResponseError: "文件上传失败!",
                dictDefaultMessage: "<span class='bigger-150 bolder'><i class='icon-caret-right red'></i>拖动文件</span>上传\ <span class='smaller-80 gre'>(或者点击上传)</span> <br /> \ <i class='upload-icon icon-cloud-upload blue icon-3x'></i>",
    
                /* 上传缩略图预览模板 */
                previewTemplate: ' <div id="viewer"  class="dz-preview dz-file-preview">    <div class="dz-details" onClick="viewFile(this)" name="">  <div style="display:none;" class="fileId"></div>   <div class="dz-filename"><span data-dz-name></span></div>       <div class="dz-size" data-dz-size></div>    <img data-dz-thumbnail />    </div>    <div class="dz-progress"><span class="dz-upload" data-dz-uploadprogress></span></div>   <div class="dz-success-mark"><span>?</span></div>                           <div class="dz-error-mark"><span>?</span></div>                             <div class="dz-error-message"><span data-dz-errormessage>""</span></div>                          </div>                       ',
                /*accept: function(file, done) {
                    fileList_Accepted.push(file)
                    done();
                }, */
                init: function () {
                    /*  var self = this;
                     // 非自动上传。点击上传按钮开始ajax上传
                     this.element.querySelector("button#uploadBtn").addEventListener("click", function(e) {
                       e.preventDefault();
                       e.stopPropagation();
                       self.processQueue();
                     }); */
    
    
                    /*var accept = this.getAcceptedFiles();//所有接受的文件(合法)
                    var reject = this.getRejectedFiles();//所有拒绝的文件(非法)
                    var uploading = this.getQueuedFiles();//所有上传中的文件
                    var queued = this.getRejectedFiles(); //所有排队中的文件
                    */
                    var this_ = this;
                    fileList = this.getAcceptedFiles();//所有接受的文件(合法)
                    this.on("addedfile", function (file) {  //新添加的文件,每添加一个新文件都会触发一次该函数,可以使用alert测试一下
                        //alert("addedfile:"+file.name)
                        //fileList.push(file);
                    })
                    this.on("canceled", function (file, response) {  //当取消文件上传式调用
                        //单个文件点击“取消上传”并确认后执行该函数,将该文件从上传列队中移除。
                        for (var i in uploadFileArray) {
                            if (uploadFileArray[i].name.trim() == file.name.trim()) {
                                var xmlHttpRequest = xmlHttpRequestArray[i];
                                xmlHttpRequest.abort();
                            }
                        }
    
                    })
                    this.on("sending", function (file, xmlHttpRequest, formData) {  //文件上传前调用
                        console.log(xmlHttpRequest);
                        uploadFileArray.push(file);
                        xmlHttpRequestArray.push(xmlHttpRequest);
                        // 每个文件需要传后台不同的参数的话,可在此处处理
                        formData.append('fileName',escape(escape(file.name))); // fileName 如果实体里有对应的属性,直接映射上,不管有没有会都会放入request参数里
                    })
                    this.on("uploadprogress", function (file, progress, bytesSent) {
                        //文件上传监听器(file:文件、progress:上传进度n%、bytesSent:)
    
                    })
    
                    this.on("complete", function (file, response) {
                        //当上传完成,成功或者出现错误时调用.
                        //alert("complete:"+response)
    
                    })
                    this.on("success", function (file, response) {  //文件已经成功上传,获得服务器返回信息作为第二个参数
                        //每个文件上传成功后有以下处理
                        //1.该文件会自动将UI拼接到上传区域,我们需要将文件的服务器路径隐藏到该UI中。为移除等操作提供便利。
                        IsServerError = JSON.parse(JSON.parse(response).error)
                        var File_PhysicalPath = "";
                        var list = JSON.parse(JSON.parse(response).uploadFileResultClientList)
                        for (var k in list) {
                            var file0 = list[k];
                            //alert(file0.fileName.trim()+":"+file.name+"\n"+file0.fileSize+":"+file.size)
                            if (file0.fileName.trim() == file.name && file0.fileSize == file.size) {
                                File_PhysicalPath = file0.physical_path;
                            }
                        }
                        $(".dz-filename span").each(function () {
                            if ($(this).text().trim() == file.name.trim()) {
                                $(this).parent().parent().find(".fileId").text(File_PhysicalPath);
                                fileUploadedPathsArray.push(File_PhysicalPath);
                            }
                        })
    
                    });
                    this.on("queuecomplete", function (file, response) { //当上传队列中的所有文件上传完成时调用.
                        //alert("任务完成!")
                        if (IsServerError) {
                            alert("服务器获取文件夹配置失败!即将回滚上传操作");//若提示该警告,请查看com.nbc.demok.io.Upload.multi_upload()方法中的PropertiesUtils.getProperty("")获取配置是否为空。为空的话,请及时在配置文件中添加该配置
    
                            //1.后台:遇到服务器异常,删除已上传的服务器上的文件
                            var filePaths = "";
                            for (var i in fileUploadedPathsArray) {
                                var path = fileUploadedPathsArray[i];
                                if (path != "") {
                                    filePaths = (filePaths == "") ? path : (filePaths + "¤¤¤¤¤" + path);
                                }
                            }
                            if (filePaths.trim() != "") {
                                removeFilesFromServer(filePaths);//服务器:移除所有未遇到错误之前的刚刚上传了的文件
                            }
    
                            //2.前端:移除所有显示的附件
                            this.removeAllFiles(true);
    
                        }
                    });
    
                    this.on("removedfile", function (file) { //删除单一文件
                        //alert("removedfile:"+file.name+"\npath:"+$(file.previewElement).find(".fileId").text())
                        //文件在服务器上的路径
                        var filePath = $(file.previewElement).find(".fileId").text().trim();
                        //删除文件操作有以下步骤:
                        //1.使用ajax删除在服务器上的该文件
                        if (filePath != "") {
                            removeFilesFromServer(filePath);
                        }
                        //2.删除文件在前端的显示
                        this.removeFile(file);
    
                    });
                    this.on("error", function (file, errorMessage) { //不接受该文件(非定义的可接受类型)或上传失败
                        //alert("error:"+file.name+"    "+errorMessage+"\nIsServerError:"+IsServerError)
                        //this.removeFile(file);
                    });
                }
            };
    
            function removeFilesFromServer(filePaths) {
                var path = $("#basePath").val();
                if (path == undefined) {
                    alert("获取工程根目录出错");//请查看页面是否有id="basePath"的输入框,并且该输入框存放项目根目录
                    return;
                }
                $.ajax({
                    type: "POST",
                    timeout: 60000,
                    dataType: "json",
                    url: path + "/dropzone_backend/dropzone_upload.jsp?method=remove",  //后台url请求,处理传递的参数
                    async: false,
                    data: {
                        filePaths: escape(escape(filePaths))
                    },
                    beforeSend: function (xhr) {
                        $("#loading_").css("display", "block");    // 数据加载成功之前,使用loading组件(使用加载中的图片,显示图片gif即可)
                    },
                    success: function (data) {
                        //ajax请求成功执行该函数
                        $("#loading_").css("display", "none");  	 //关闭加载中图片
                        //alert("删除成功,数量:"+data.count+"个")
                    },
                    error: function (XMLHttpRequest, textStatus, errorThrown) {
                        $("#loading_").css("display", "none") //
                        if (textStatus == "timeout") {
                            alert(" 请求超时,可能是网络较慢,请重新加载")
                        } else {
                            alert("XMLHttpRequest.status:" + XMLHttpRequest.status + "\n" + "XMLHttpRequest.readyState:" + XMLHttpRequest.readyState + "\n"
                                + "textStatus:" + textStatus);
                        }
                    }
                });
            }
    
    
            function viewFile(obj) {
                var filePath = $(obj).find(".fileId").text();
    
                if (filePath.trim().length > 0) {
                    p = filePath.split(".");
                    var suffix = "." + p[p.length - 1];   //后缀为 [.doc .docx .xls .xlsx .ppt .pptx]可以转pdf在线浏览
                    //alert(suffix);
                    var IsOffice = false;
                    var arr = new Array(".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx")
                    for (var i in arr) {
                        if (suffix == arr[i].trim()) {
                            IsOffice = true;
                        }
                    }
                    if (IsOffice) {
                        Open_Office_File(filePath)
                    } else {
                        Open_Not_Office_File(filePath);
                    }
                }
            }
    
            function Open_Office_File(path) {
                alert("查看文件处理:" + path)
            }
    
            function Open_Office_File(path) {
                alert("查看文件处理:" + path)
            }
    
        </script>
    
    </head>
    <body>
    
    <input type="hidden" id="basePath" value="<%=request.getContextPath()%>"/>
    <br>
    
    <h2>文件上传:</h2>
    <%-- 想优化的话,将 dropzone_backend/dropzone_upload.jsp 换成自己的后端action 接口即可    --%>
    <form id="dropzoneUploadForm" action="dropzone_backend/dropzone_upload.jsp" class="dropzone">
        <%--        <button id="uploadBtn" class="btn btn-success"> 确认上传 </button>--%>
    </form>
    
    
    </body>
    </html>
    
  • dropzone_upload.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <%@page import="dropzone.util.DropzoneUploadUtil" %>
    <%
    
        String method = (request.getParameter("method") == null) ? "" : request.getParameter("method").trim();
        method = ("".equals(method)) ? "post" : method;
    
        if ("post".equals(method)) {
            // 上传附件
            DropzoneUploadUtil.dropzoneUploadFile(request, response);
        } else if ("remove".equals(method)) {
            // 删除附件
            DropzoneUploadUtil.dropzoneRemoveFile(request, response);
        }
    
    %>
    
  • DropzoneUploadUtil.java

    package dropzone.util;
    
    import com.google.gson.Gson;
    import dropzone.entity.UploadFileResultEntity;
    import org.apache.commons.fileupload.FileItem;
    import org.apache.commons.fileupload.FileItemFactory;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.json.JSONException;
    import org.json.JSONObject;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * 使用dropzone插件上传
     */
    public class DropzoneUploadUtil {
    
        public static String uploadFilePath = "/Users/susu/file_test/file_upload/file_upload_0409";
    
        /**
         * 上传附件
         * @param request
         * @param response
         * @throws IOException
         * @throws JSONException
         */
        public static void dropzoneUploadFile(HttpServletRequest request, HttpServletResponse response) throws IOException, JSONException {
    
            String physical_path = "";
            List<UploadFileResultEntity> uploadFileResultClientList = new ArrayList<>();
            List<UploadFileResultEntity> uploadFileResultServerList = new ArrayList<>();
    
            Gson gson = new Gson();
            JSONObject json = new JSONObject();
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            SimpleDateFormat fmt = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss_SSS");
            String date = fmt.format(System.currentTimeMillis());
    
            upload.setHeaderEncoding("UTF-8");
            try {
                List items = upload.parseRequest(request);
                Iterator iter = items.iterator();
                while (iter.hasNext()) {
                    FileItem item = (FileItem) iter.next();
                    if (!item.isFormField()) {
                        String OriginalName = item.getName().substring(item.getName().lastIndexOf("\\") + 1);
                        String fileName = OriginalName.substring(0, OriginalName.lastIndexOf(".")) + "@@" + date + "@@" + item.getName().substring(item.getName().lastIndexOf("."), item.getName().length());
    
                        File f = new File(uploadFilePath);
                        if (!f.exists()) {
                            f.mkdirs();
                        }
    //                        server_path = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/temp/" + fileName;
                        physical_path = uploadFilePath + "/" + fileName;
                        File uploadedFile = new File(physical_path);
    
                        System.out.println("physical_path:" + physical_path);
    
                        item.write(uploadedFile);
                        uploadFileResultServerList.add(new UploadFileResultEntity(fileName, uploadedFile.length(), physical_path, ""));
                        uploadFileResultClientList.add(new UploadFileResultEntity(OriginalName, uploadedFile.length(), physical_path, ""));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            response.setContentType("text/text;charset=utf-8");
            PrintWriter out = response.getWriter();
            json.put("error", false);
            json.put("uploadFileResultServerList", gson.toJson(uploadFileResultServerList));
            json.put("uploadFileResultClientList", gson.toJson(uploadFileResultClientList));
            out.print(json);
            out.flush();
            out.close();
        }
    
        /**
         * 删除附件(删除服务器上的附件)
         * @param request
         * @param response
         */
        public static void dropzoneRemoveFile(HttpServletRequest request,HttpServletResponse response){
            JSONObject json = new JSONObject();
            String filePathsStr = (request.getParameter("filePaths") == null) ? "" : request.getParameter("filePaths").trim();
            String[] filePathsArray = null;
            try {
                if (!filePathsStr.equals("")) {
                    if (filePathsStr.indexOf("¤¤¤¤¤") > 0) {
                        filePathsArray = filePathsStr.split("¤¤¤¤¤");
                    } else {
                        filePathsArray = new String[1];
                        filePathsArray[0] = filePathsStr;
                    }
                    int deleteCount = removeFile(filePathsArray);
                    json.put("count", deleteCount);
                }
                PrintWriter p = response.getWriter();
                p.println(json);  //response ajax data,InputThinPCAccount2.js receive this "flag"。
                p.flush();
                p.close();
            } catch (JSONException e) {
                throw new RuntimeException(e);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    
        public static int removeFile(String[] paths) {
            int deleteCount = 0;
            for (String filePath : paths) {
                filePath = ScriptDecoderUtil.unescape(ScriptDecoderUtil.unescape(filePath));
                File file = new File(filePath);
                if (!file.exists()) {
                    System.out.println("系统找不到指定的路径:" + filePath);
                } else if (!file.delete()) {
                    System.out.println("删除附件失败:" + filePath);
                } else {
                    deleteCount++;
                }
            }
            return deleteCount;
        }
    
    }
    

2.4 参考

  • 在下面项目上进行修改并测试,如下:
    dropzone上传插件demo.

3. 附项目下载

  • 上面测试效果的完整项目,拿来即用的话可以下载,下载如下:
    使用uploadify插件(php版和Java版) 与 Dropzone.js插件分别实现附件上传的demo .

4. 可能遇到问题

4.1 idea中导入eclipse项目

  • 如遇到此问题,可看下面的文章:
    idea中导入eclipse的javaweb项目——tomact服务(保姆级别).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1636295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作DOM:性能优化之道

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【webrtc】MessageHandler 3: 基于线程的消息处理:以sctp测试为例

消息处理可以用于模拟发包处理G:\CDN\rtcCli\m98\src\net\dcsctp\socket\dcsctp_socket_network_test.cc 这个实现中,onMessage还是仅对了一种消息进行处理,就是接收则模式下,打印带宽。当然,可能程序有多个消息,分别在不同的onmessage中执行?SctpActor:以一个恒定的速率…

u盘量产工具拥有分区功能,它把一个U盘分成数个移动盘,更改U盘介质类型(Fixed 和 Removabe),供大家学习研究参考~

非常受欢迎的u盘量产工具。最新版拥有分区功能&#xff0c;它把一个U盘分成数个移动盘&#xff0c;更改U盘介质类型(Fixed 和 Removabel)。数码之家量产工具官方版不是数据恢复&#xff0c;是对U盘底层硬件信息的恢复(非硬件损坏)&#xff0c;使因为底层硬件信息受损电脑无法识…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-8.2-链接脚本

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

如何利用仪表构造InfiniBand流量在数据中心测试中的应用

一、什么是Infiniband&#xff1f; 在当今数据爆炸的时代&#xff0c;数据中心作为信息处理的中心枢纽&#xff0c;面临着前所未有的挑战。传统的通信方式已经难以满足日益增长的数据传输需求&#xff0c;而InfiniBand技术的出现&#xff0c;为数据中心带来了全新的通信解决方…

在AndroidStudio创建Flutter项目并运行到模拟器

1.Flutter简介 Flutter是Google开源的构建用户界面&#xff08;UI&#xff09;工具包&#xff0c;帮助开发者通过一套代码库高效构建多平台精美应用&#xff0c;支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费&#xff0c;拥有宽松的开源协议&#xff0c;适合商…

如何提升制造设备文件汇集的可靠性和安全性?

制造设备文件汇集通常指的是将与制造设备相关的各种文档和资料进行整理和归档的过程。这些文件可能包括但不限于&#xff1a; 生产数据&#xff1a;包括生产计划、订单信息、生产进度等。 设计文件&#xff1a;如CAD图纸、设计蓝图、产品模型等。 工艺参数&#xff1a;用于指…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

如何判断第三方软件测试公司是否具有资质

在软件开发的过程中&#xff0c;软件测试是确保软件质量、稳定性和用户体验的关键环节。许多企业选择将软件测试工作交给专业的第三方软件测试公司来完成&#xff0c;以确保测试的准确性和公正性。但是&#xff0c;如何判断一个第三方软件测试公司是否具有资质呢&#xff1f;以…

第11章 数据库技术(第一部分)

一、数据库技术术语 &#xff08;一&#xff09;术语 1、数据 数据描述事物的符号描述一个对象所用的标识&#xff0c;可以文字、图形、图像、语言等等 2、信息 现实世界对事物状态变化的反馈。可感知、可存储、可加工、可再生。数据是信息的表现形式和载体&#xff0c;信…

基于肤色模型的人脸识别FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 matlab2022a的测试结果如下&#xff1a; vivado2019.2的仿真结果如下&#xff1a; 将数据导入到matlab中&#xff0c; 系统的RTL结构图如下图所示…

Guitar Pro8中文最新免费版吉他编曲学习软件下载

Guitar Pro 8是一款专业的吉他编曲学习软件&#xff0c;支持多种乐器。具体来说&#xff0c;它支持所有的4至8弦的弹拨乐器&#xff0c;包括但不限于吉他、贝斯、班卓琴、曼陀铃等。此外&#xff0c;它还支持鼓、钢琴、尤克里里等乐器。因此&#xff0c;无论是初学者还是高手&a…

数据挖掘之基于K近邻算法的原油和纳斯达克股票数据预测分析

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在当今日益复杂的金融市场中&#xff0c;准确地预测原油价格和纳斯达克股票市场的走势对于投资者、政…

基于Spring Boot的校园博客系统设计与实现

基于Spring Boot的校园博客系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页、文…

【再探】设计模式—抽象工厂及建造者模式

抽象工厂模式和建造者模式都属于创建型模式。两者都能创建对应的对象&#xff0c;而创建者模式更侧重于创建复杂对象&#xff0c;将对象的创建过程封装起来&#xff0c;让客户端不需要知道对象的内部细节。 1 抽象工厂模式 需求&#xff1a; 在使用工厂方法模式时&#xff0…

Gateway Predicate断言(谓词)

是什么 Spring Cloud Gateway匹配路由作为Spring WebFlux HandlerMapping基础设施的一部分。 Spring Cloud Gateway包含许多内置的路由谓词工厂。 所有这些谓词都匹配HTTP请求的不同属性。 您可以使用逻辑 and 语句来联合收割机组合多个路由谓词工厂。 Predicate就是为了实现一…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

SQL dialect is not configured. Apache Cassandra matches best.没有配置SQL方言 如何处理

我这里是MySQL语言,所以我设置MySQL dialect 写个记录,之后更换全局SQL语言再换 下图是设置

Vue通过下拉框选择字典值,并将对应的label以及value值提交到后端

产品品种从字典中获取 产品性质也是从字典中获取 字典当中的保存 dict_type表 dict_data表 在表单提交的方法中 1.因为做的产品性质是多选&#xff0c;它会以数组的方式提交&#xff0c;所以需要先将Json格式转变为String JSON.stringify(this.form.nature) 2.提交表单&…