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

实操——使用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服务(保姆级别).

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之二(大小模型协同)

一、概述 随着新一代信息技术在产业数字化中的应用&#xff0c;产生了大量多源多模态信息以及响应的信息处理模式&#xff0c;数据孤岛、模型林立的问题也随之产生&#xff0c;使得业务系统臃肿、信息处理和决策效率低下&#xff0c;面对复杂任务及应用场景问题求解效率低。针…

【iOS】消息流程分析

文章目录 前言动态类型动态绑定动态语言消息发送objc_msgSendSEL&#xff08;selector&#xff09;IMP&#xff08;implementation&#xff09;IMP高级用法 MethodSEL、IMP、Method总结流程概述 快速查找消息发送快速查找的总结buckets 慢速查找动态方法解析resolveInstanceMet…

如何远程访问服务器?

在现代信息技术的快速发展下&#xff0c;远程访问服务器已成为越来越多用户的需求。远程访问服务器能够让用户随时随地通过网络连接服务器&#xff0c;实现数据的传输和操作。本文将介绍远程访问服务器的概念&#xff0c;以及一种广泛应用于不同行业的远程访问解决方案——【天…

软考之零碎片段记录(二十九)+复习巩固(十七、十八)

学习 1. 后缀式&#xff08;逆波兰式&#xff09; 2. c/c语言编译 类型检查是语义分析 词法分析。分析单词。如单词的字符拼写等语法分析。分析句子。如标点符号、括号位置等语言上的错误语义分析。分析运算符、运算对象类型是否合法 3. java语言特质 即时编译堆空间分配j…

2024抖音AI图文带货班:在这个赛道上 乘风破浪 拿到好效果

课程目录 1-1.1 AI图文学习指南 1.mp4 2-1.2 图文带货的新机会 1.mp4 3-1.3 2024年优质图文新标准 1.mp4 4-1.4 图文如何避免违规 1.mp4 5-1.5 优质图文模板解析 1.mp4 6-2.1 老号重启 快速破局 1.mp4 7-2.2 新号起号 不走弯路 1.mp4 8-2.3 找准对标 弯道超车 1.mp4 9…

深度学习之基于Tensorflow卷积神经网络公共区域行人人流密度可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在公共区域&#xff0c;如商场、火车站、地铁站等&#xff0c;人流密度的监控和管理对于确保公共安全…

anaconda的安装和Jupyter Notebook修改默认路径

anaconda的安装 就一个注意事项:在结尾时候记得配置系统环境变量 要是没有配置这个环境变量,后面就不能cmd启动Jupyter Notebook Jupyter Notebook修改默认路径 我们要找到Jupyter Notebook的配置文件 输入下面指令 jupyter notebook --generate-config就可以找到存放配置文…

Linux图形化界面怎么进入?CentOS 7图形界面切换

CentOS 7默认只安装命令行界面。要切换到图形界面&#xff0c;需要先检查系统是否安装图形界面&#xff0c;在终端输入以下命令&#xff1a; systemctl get-default若是返回结果是“multi-user.target”表示系统没有安装图形界面&#xff1b;若是返回结果是“graphical.target…

上传jar到github仓库,作为maven依赖存储库

记录上传maven依赖包到github仓库问题 利用GitHubPackages作为依赖的存储库踩坑1 仓库地址问题踩坑2 Personal access tokens正确姿势一、创建一个普通仓库&#xff0c;比如我这里是fork的腾讯Shadow到本地。地址是&#xff1a;https://github.com/dhs964057117/Shadow二、生成…

【分享】如何将word格式文档转化为PDF格式

在日常的办公和学习中&#xff0c;我们经常需要将Word文档转换为PDF格式。PDF作为一种通用的文件格式&#xff0c;具有跨平台、易读性高等优点&#xff0c;因此在许多场合下都更为适用。那么&#xff0c;如何实现Word转PDF呢&#xff1f;本文将介绍几种常用的方法&#xff0c;帮…

Git推送本地项目到gitee远程仓库

Git 是一个功能强大的分布式版本控制系统&#xff0c;它允许多人协作开发项目&#xff0c;同时有效管理代码的历史版本。开发者可以克隆一个公共仓库到本地&#xff0c;进行更改后将更新推送回服务器&#xff0c;或从服务器拉取他人更改&#xff0c;实现代码的同步和版本控制。…

Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频

概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础&#xff0c;引入了一系列突破性的功能&#xff0c;有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑&#xff0c;为质量…

PHP算命源码_最新测算塔罗源码_可以运营

功能介绍 八字精批、事业财运、姓名分析、宝宝起名、公司测名、姓名配对、综合详批、姻缘测算、牛年感情、PC版测算、八字合婚、紫微斗数、鼠年运程、月老姻缘、许愿祈福、号码解析、塔罗运势、脱单占卜、感情继续、脱单占卜、塔罗爱情、心理有你、能否复合、暗恋对象、是否分…

JavaScript任务执行模式:同步与异步的奥秘

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

设计模式之代理模式ProxyPattern(六)

一、代理模式介绍 1、什么是代理模式&#xff1f; 代理模式是一种结构型设计模式&#xff0c;它允许为其他对象提供一个替代品或占位符&#xff0c;以控制对这个对象的访问。 2、代理模式的角色构成 抽象主题&#xff08;Subject&#xff09;&#xff1a;定义了真实主题和代…

FineBI学习:K线图

效果图 底表结构&#xff1a;日期、股票代码、股票名称、开盘价、收盘价、最高价、最低价 步骤&#xff1a; 横轴&#xff1a;日期 纵轴&#xff1a;开盘价、最低价 选择【自定义图表】&#xff0c;或【瀑布图】 新建字段&#xff1a;价差&#xff08;收盘-开盘&#xf…

鸿蒙准备1

鸿蒙心路 感慨索性&#xff0c; 看看鸿蒙吧。打开官网相关介绍 新建工程目录结构 感慨 最近面试Android应用开发&#xff0c;动不动就问framework的知识&#xff0c;什么touch事件的触发源是啥&#xff08;eventHub&#xff09;&#xff0c;gc流程是啥&#xff0c;图形框架是什…

VS2022 .Net6.0 无法打开窗体设计器

拿Vs2022 建了个Demo&#xff0c;运行环境是net6.0-windows&#xff0c;无论双击或是右键都打不开窗体设计器 打开项目目录下的*.csproj.user <?xml version"1.0" encoding"utf-8"?> <Project ToolsVersion"Current" xmlns"htt…

【Hadoop】-Hive客户端:HiveServer2 Beeline 与DataGrip DBeaver[14]

HiveServer2 & Beeline 一、HiveServer2服务 在启动Hive的时候&#xff0c;除了必备的Metastore服务外&#xff0c;我们前面提过有2种方式使用Hive&#xff1a; 方式1&#xff1a; bin/hive 即Hive的Shell客户端&#xff0c;可以直接写SQL方式2&#xff1a; bin/hive --…