• 利用bootsrap控件 实现文件上传功能


    源代码实例:https://github.com/kartik-v/bootstrap-fileinput

    一、jsp页面

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
     2 <%@ page buffer="16kb"%>
     3 <%
     4 String path = request.getContextPath();
     5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
     6 %>
     7 <!DOCTYPE html>
     8 <html lang="en">
     9 <head>
    10 <meta charset="UTF-8" />
    11 <title>Data file input</title>
    12 <link
    13     href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
    14     rel="stylesheet">
    15 <link href="css/uploadFile/fileinput.css" media="all" rel="stylesheet"
    16     type="text/css" />
    17 <link href="themes/uploadFile/explorer/theme.css" media="all"
    18     rel="stylesheet" type="text/css" />
    19 <script
    20     src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    21 <script src="js/uploadFile/plugins/sortable.js" type="text/javascript"></script>
    22 <script src="js/uploadFile/fileinput.js" type="text/javascript"></script>
    23 <script src="js/uploadFile/fileinput_locale_fr.js"
    24     type="text/javascript"></script>
    25 <script src="js/uploadFile/fileinput_locale_es.js"
    26     type="text/javascript"></script>
    27 <script src="themes/uploadFile/explorer/theme.js" type="text/javascript"></script>
    28 <script
    29     src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
    30     type="text/javascript"></script>
    31 <script type="text/javascript">
    32 
    33 </script>
    34 </head>
    35 <body>
    36     <div class="container kv-main">
    37         <div class="page-header">
    38             <h1>Data File Input</h1>
    39         </div>
    40 
    41         <form id="uploadfileform" method="post" action="uploadFile"
    42             enctype=multipart/form-data>
    43 
    44             <div class="form-group">
    45                 <input id="file" type="file" name="file" class="file"
    46                     data-upload-url="#">
    47             </div>
    48 
    49             <div class="form-group">
    50                 <button class="btn btn-warning" type="button">Disable Test</button>
    51                 <button class="btn btn-info" type="reset">Refresh Test</button>
    52                 <!--   <button class="btn btn-primary" type="button" onclick=" judgeUpload();">Submit</button>-->
    53                 <button class="btn btn-primary" type="submit">Submit</button>
    54                 <button class="btn btn-default" type="reset">Reset</button>
    55             </div>
    56 
    57         </form>
    58         <br>
    59     </div>
    60 </body>
    61 <script type="text/javascript">
    62 $(function () {
    63     //0.初始化fileinput
    64     var oFileInput = new FileInput();
    65     oFileInput.Init("file", "/uploadFile");  //file为文件控件的id,uploadFile为后台接受上传文件的servlet
    66 });
    67 var FileInput = function () {
    68     var oFile = new Object();
    69     //初始化fileinput控件(第一次初始化)
    70     oFile.Init = function(ctrlName, uploadUrl) {
    71     var control = $('#' + ctrlName);
    72     //初始化上传控件的样式
    73     control.fileinput({
    74         language: 'zh', //设置语言
    75         uploadUrl: '/deke.Business/FileUploadServlet', //上传的地址即后台接受上传文件的servlet.
    76         allowedFileExtensions: ['csv', 'arff'],//接收的文件后缀
    77         showUpload: true, //是否显示上传按钮
    78         showCaption: false,//是否显示标题
    79         browseClass: "btn btn-primary", //按钮样式     
    80         maxFileCount: 10, //表示允许同时上传的最大文件个数
    81         enctype: 'multipart/form-data',
    82         validateInitialCount:true,
    83         previewFileIcon: "<i class='glyphicon glyphicon-king'></i>",
    84         msgFilesTooMany: "选择上传的文件数量({n}) 超过允许的最大数值{m}!",
    85     });
    86     //导入文件上传完成之后的事件
    87     $("#file").on("fileuploaded", function (event, data, previewId, index) {
    88         alert("上传成功");
    89     });
    90 }
    91     return oFile;
    92 };
    93 </script>
    94 </html>

    注意事项:

    1.引入bootstrap中的控件。

    在该jsp页面中引入的js和css中最基本的两个控件是

    bootstrap-fileinput/css/fileinput.min.css

    bootstrap-fileinput/js/fileinput.min.js

    其他的都是辅助样式。

    2.两行关键代码:

    <form id="uploadfileform" method="post" action="uploadFile" enctype=multipart/form-data> 
    表单提交中的编码格式必须指定为 enctype=multipart/form-data 。
    <input id="file" type="file" name="file" class="file" data-upload-url="#">
    id="file" :在jsp页面最后的提交表单的js函数中会用到。上述代码中的65行和85行。
    data-upload-url="#":这句代码删除之后,页面内的拖拽文件上传的布局会消失。(还不太清楚为什么。)

    3.重要的JS初始化

    1
    上述代码61-92行中的js脚本是用来初始化fileinput控件。
    其中最重要的是要指定文件上传的url(65行和75行),即文件要交给哪个servlet来处理。否则即使在表单中指定了action,后台也是无法接收到上传的文件。

    2.fileinput()方法里面传入的是一个json数据,它里面有很多属性,每个属性代表着初始化上传控件的时候的特性。
    如果这些属性都不设置,则表示使用默认的设置。

    可以打开fileinput.js的源码,如图:

    
    

    二、后台代码

     1 package deke.Business;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.io.PrintWriter;
     6 import java.util.List;
     7 
     8 import javax.servlet.RequestDispatcher;
     9 import javax.servlet.ServletException;
    10 import javax.servlet.http.HttpServlet;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 import javax.servlet.http.HttpSession;
    14 
    15 import org.apache.commons.fileupload.FileItem;
    16 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
    17 import org.apache.commons.fileupload.FileUploadException;
    18 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    19 import org.apache.commons.fileupload.servlet.ServletFileUpload;
    20 
    21 public class FileUploadServlet extends HttpServlet {
    22 
    23     private static final long serialVersionUID = 1L;
    24 
    25     // location to store file uploaded
    26     private static final String UPLOAD_DIRECTORY = "upload";
    27 
    28     // upload settings
    29     private static final int MEMORY_THRESHOLD   = 1024 * 1024 * 3; 
    30     private static final int MAX_FILE_SIZE      = 1024 * 1024 * 40; 
    31     private static final int MAX_REQUEST_SIZE   = 1024 * 1024 * 50; 
    32 
    33     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    34         response.setCharacterEncoding("GBK");
    35         PrintWriter out = response.getWriter();
    36         if (!ServletFileUpload.isMultipartContent(request)) {
    37             out.println("Error: Form must has enctype=multipart/form-data.");
    38             out.flush();
    39             return;
    40         }
    41 
    42         DiskFileItemFactory factory = new DiskFileItemFactory();
    43         factory.setSizeThreshold(MEMORY_THRESHOLD);
    44         factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
    45 
    46         ServletFileUpload upload = new ServletFileUpload(factory);
    47         upload.setFileSizeMax(MAX_FILE_SIZE);
    48         upload.setSizeMax(MAX_REQUEST_SIZE);
    49         String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
    50         File uploadDir = new File(uploadPath);
    51         if (!uploadDir.exists()) {
    52             uploadDir.mkdir();
    53         }
    54         List<FileItem> formItems = null;
    55         try {
    56             formItems = upload.parseRequest(request);
    57             if(formItems == null || formItems.size() == 0) {
    58                 response.sendRedirect("main.jsp");
    59                 return;
    60             }
    61 
    62             for (FileItem item : formItems) {
    63                 if (!item.isFormField()) {
    64                     String fileName = new File(item.getName()).getName();
    65                     String filePath = uploadPath + File.separator + fileName;
    66                     File storeFile = new File(filePath);
    67                     item.write(storeFile);
    68                     HttpSession mysession = request.getSession();
    69                     mysession.setAttribute("fileName", fileName);
    70                     mysession.setAttribute("filePath", filePath);
    71                     mysession.setAttribute("uploadFile", storeFile);
    72                 }
    73             }
    74 
    75         } catch (FileUploadException e) {
    76             if (e instanceof SizeLimitExceededException) {
    77                 out.print("<script>alert('文件上传超过最大限制:" + MAX_FILE_SIZE + "瀛楄妭');history.back();</script>"); 
    78                 return;
    79             }
    80         } catch (Exception e) {
    81             e.printStackTrace();
    82         }
    83 
    84         request.getRequestDispatcher("/main.jsp").forward(request,response);
    85     }
    86 }

     关于中文显示问题:

    1.文件上传控件的中文显示问题。

     图中的“选择”按钮和“拖拽文件”默认显示为英文,若想做到中文显示。需要两步:

    第一步:修改fileinput.js文件

    打开fileinput.js文件,修改如下几处原来的en为zh:

    1。   lang = options.language || self.data('language') || 'zh', opts;

    2。   if (lang !== 'zh' && !isEmpty($.fn.fileinputLocales[lang])) {

    3。  opts = $.extend(true, {}, $.fn.fileinput.defaults, t, $.fn.fileinputLocales.zh, l, options,

    4。  language: 'zh',

    第二步:在jsp页面内引入本地化的js  :zh.js

    <script src="js/uploadFile/locales/zh.js"  type="text/javascript"></script> 

    2.上传文件中的中文乱码问题。

    上传的文件中如果包含中文,会出现中文乱码问题。原因是,文件的编码不是utf-8格式,手工将文件的编码格式转成utf-8即可。

  • 相关阅读:
    3. 无重复字符的最长子串
    字节跳动 最小栈
    排序
    线程的优先级
    线程的操作方法
    线程的生命周期
    实现线程的方式:Thread类重写run();Runnable类重写run();Callable类重写call();实现线程的方式
    Java thread run() start() 是干什么的以及区别
    Java thread 多线程
    助教工作学期总结
  • 原文地址:https://www.cnblogs.com/lyr2015/p/6686267.html
Copyright © 2020-2023  润新知