使用ajax、servlet实现多文件的上传

搭建环境

这里使用maven导入jar包:

<dependencies>
  <!--文件上传-->
  <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.2</version>
  </dependency>
  <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-io</artifactId>
      <version>1.3.2</version>
  </dependency>
  <!--json-->
  <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20160810</version>
  </dependency>

</dependencies>

这里写图片描述
这里写图片描述
三个主要的jar包,这里还将使用jquery以及异步提交表单,所以需要jquery和jquery.form文件
这里写图片描述

jsp页面

<%--
  Created by IntelliJ IDEA.
  User: wqh
  Date: 2017/5/26
  Time: 9:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.form.js"></script>

<script type="text/javascript">
    $(function () {
      $("#sub").bind("click",function () {
          var option = {
              type:"post",
              url:"${pageContext.request.contextPath}/TestServlet",
              async: true,
              enctype:"multipart/form-data",
              dataType:"json",
              error:function(data){
                  alert(data);
              },
              success:function(msg){
                  //将结果格式化为json
                  var json = eval(msg);
                  var data = "";
                  $.each(json,function (index,item) {
                       var key = json[index].file;
                       data = data +"==="+ key
                  });
                    alert(data);
              }
          };
         $("#fileForm").ajaxSubmit(option);
      })
    });

</script>
<head>
    <title>Title</title>
</head>
<body>
    <form action="#" id="fileForm" enctype="multipart/form-data" method="post" >
        <input type="file" name="file"/><br>
        <input type="file" name="file"/><br>
        <input type="file" name="file"/><br>
        <button type="submit"  name="sub" id="sub">提交</button>
    </form>
</body>
</html>

这里写图片描述

servlet代码

文件上传测试,上传文件就不保存到本地l。直接向页面返回文件名,返回json格式。

 req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        List<String> fileName = new ArrayList<>();
        boolean ismultipartContent = ServletFileUpload.isMultipartContent(req);
        //判断是否是文件上传
        if (ismultipartContent) {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload fileUpload = new ServletFileUpload(factory);
            try {
                List<FileItem> fileItems = fileUpload.parseRequest(req);
                for (FileItem fileItem : fileItems) {
                    //判断字段的类型
                    if (fileItem.isFormField()) {
                        //处理普通字段
                    } else{
                        //文件字段,处理上传字段,这里就不把文件保存到本地了
                        fileName.add(fileItem.getName());
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
            //将list转化为json
            int index = 1;
            JSONArray jsonArray = new JSONArray();
            for (String s : fileName){
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("file",s);
                jsonArray.put(jsonObject);
            }
            resp.getWriter().print(jsonArray);
        }

测试

选择上传的文件
这里写图片描述

这里写图片描述
文件上传测试和返回json格式的文件名成功!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Servlet 是 Java Web 开发中常用的技术之一,它可以处理 HTTP 请求和响应。关于多文件上传实现,一般有两种方式: 1. 使用 Apache Commons FileUpload 库 该库是 Apache 组织开发的一个用于处理文件上传的 Java 库,可以方便地实现文件上传功能。具体使用方法可以参考以下代码示例: ``` protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取上传文件的保存目录 String savePath = getServletContext().getRealPath("/upload"); // 判断上传文件的保存目录是否存在,不存在则创建 File file = new File(savePath); if (!file.exists() && !file.isDirectory()) { System.out.println(savePath + "目录不存在,需要创建"); file.mkdir(); } // 消息提示 String message = ""; try { // 创建 DiskFileItemFactory 对象,设置缓冲区大小和临时文件目录 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 1024 * 10); // 设置缓冲区大小为10M factory.setRepository(file); // 设置临时文件目录为 upload 目录 // 创建 ServletFileUpload 对象,并设置上传文件的大小限制 ServletFileUpload upload = new ServletFileUpload(factory); upload.setFileSizeMax(1024 * 1024 * 100); // 设置上传文件大小的最大值为100M // 解析上传文件 List<FileItem> items = upload.parseRequest(request); // 遍历解析的文件 for (FileItem item : items) { // 判断是否为上传文件项 if (item.isFormField()) { String fieldName = item.getFieldName(); String fieldValue = item.getString("UTF-8"); System.out.println(fieldName + "=" + fieldValue); } else { // 获取上传文件名 String fileName = item.getName(); System.out.println("上传文件名为:" + fileName); // 如果文件名为空,则说明没有选择上传文件 if (fileName == null || fileName.trim().equals("")) { continue; } // 获取上传文件的后缀名 String suffix = fileName.substring(fileName.lastIndexOf(".")); // 新建一个文件名,避免重复 String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix; // 创建上传文件对象 File uploadFile = new File(savePath, newFileName); // 将上传文件保存到指定目录下 item.write(uploadFile); message = "文件上传成功!"; } } } catch (Exception e) { message = "文件上传失败!"; e.printStackTrace(); } request.setAttribute("message", message); request.getRequestDispatcher("/message.jsp").forward(request, response); } ``` 2. 使用 HTML5 的 FormData 对象 在 HTML5 中,新增了 FormData 对象,它可以用于在客户端向服务器发送数据。结合 AJAX 技术,可以实现文件上传功能。以下是使用 FormData 和 AJAX 实现文件上传的示例代码: ``` <form id="uploadForm"> <input type="file" name="file" multiple> <input type="button" value="上传" onclick="upload()"> </form> <script> function upload() { var form = document.getElementById("uploadForm"); var formData = new FormData(form); var xhr = new XMLHttpRequest(); xhr.open("POST", "/uploadServlet"); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log(xhr.responseText); } }; xhr.send(formData); } </script> ``` 需要注意的是,在使用 FormData 对象上传多个文件时,要将表单元素的 multiple 属性设置为 true。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值