java基于servlet的文件异步上传

时间:2022-07-01 22:01:01

在这里使用了基于servlet的文件异步上传,好了废话不多说,直接上代码了。。。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.future.zfs.util;
 
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
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.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
@SuppressWarnings("serial")
public class FileUploadServlet extends HttpServlet {
 
  final long MAX_SIZE = 10 * 1024 * 1024;// 设置上传文件最大为 10M
  // 允许上传的文件格式的列表
  final String[] allowtype = new String[] {"jpg","jpeg","gif","txt","doc","docx","mp3","wma","m4a","xls"};
 
  public FileUploadServlet() {
    super();
  }
 
  public void destroy() {
    super.destroy();
  }
 
  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    // 设置字符编码为UTF-8, 这样支持汉字显示
    response.setCharacterEncoding("UTF-8");
 
    // 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
    DiskFileItemFactory dfif = new DiskFileItemFactory();
    dfif.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
    dfif.setRepository(new File(request.getRealPath("/")
        + "uploadtemp"));// 设置存放临时文件的目录,web根目录下的uploadtemp目录
    // 用以上工厂实例化上传组件
    ServletFileUpload sfu = new ServletFileUpload(dfif);
    // 设置最大上传尺寸
    sfu.setSizeMax(MAX_SIZE);
 
    PrintWriter out = response.getWriter();
    // 从request得到 所有 上传域的列表
    List fileList = null;
    try {
      fileList = sfu.parseRequest(request);
    } catch (FileUploadException e) {// 处理文件尺寸过大异常
      if (e instanceof SizeLimitExceededException) {
        out.println("{message:'文件尺寸超过规定大小:"+MAX_SIZE+"字节'}");
        return;
      }
      e.printStackTrace();
    }
    // 没有文件上传
    if (fileList == null || fileList.size() == 0) {
      out.println("{message:'请选择上传文件'}");
      return;
    }
    // 得到所有上传的文件
    Iterator fileItr = fileList.iterator();
    // 循环处理所有文件
    while (fileItr.hasNext()) {
      FileItem fileItem = null;
      String path = null;
      long size = 0;
      // 得到当前文件
      fileItem = (FileItem) fileItr.next();
      // 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
      if (fileItem == null || fileItem.isFormField()) {
        continue;
      }
      // 得到文件的完整路径
      path = fileItem.getName();
      // 得到文件的大小
      size = fileItem.getSize();
      if ("".equals(path) || size == 0) {
        out.println("{message:'请选择上传文件'}");
        return;
      }
 
      // 得到去除路径的文件名
      String t_name = path.substring(path.lastIndexOf("\\") + 1);
      // 得到文件的扩展名(无扩展名时将得到全名)
      String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
      // 拒绝接受规定文件格式之外的文件类型
      int allowFlag = 0;
      int allowedExtCount = allowtype.length;
      for (; allowFlag < allowedExtCount; allowFlag++) {
        if (allowtype[allowFlag].equals(t_ext))
          break;
      }
      if (allowFlag == allowedExtCount) {
        String message = "";
        for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++){
          message+="*." + allowtype[allowFlag]
                        + " ";
        }
        out.println("{message:'请上传以下类型的文件"+message+"'}");
        return;
      }
 
      long now = System.currentTimeMillis();
      // 根据系统时间生成上传后保存的文件名
      String prefix = String.valueOf(now);
      // 保存的最终文件完整路径,保存在web根目录下的upload目录下
      String u_name = request.getRealPath("/") + "upload/"
          + prefix + "." + t_ext;
      //原来的文件名
      path=request.getRealPath("/") + "upload/"+path;
      try {
        // 保存文件
        fileItem.write(new File(path));
        response.setStatus(200);
        out.println("{message:\"文件上传成功. 已保存为: " + prefix + "." + t_ext
            + " 文件大小: " + size + "字节\"}");
      } catch (Exception e) {
        e.printStackTrace();
      }
 
    }
  }
}

web.xml

?
1
2
3
4
5
6
7
8
<servlet>
    <servlet-name>fileUploadServlet</servlet-name>
    <servlet-class>com.future.zfs.util.FileUploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>fileUploadServlet</servlet-name>
    <url-pattern>/fileUploadServlet</url-pattern>
  </servlet-mapping>

上传页面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<%@ 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>
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/ajaxfileupload.js"></script>
    <script type="text/javascript">
  function ajaxFileUpload()
  {
    
    $("#loading")
    .ajaxStart(function(){
      $(this).show();
    })//开始上传文件时显示一个图片
    .ajaxComplete(function(){
      $(this).hide();
    });//文件上传完成将图片隐藏起来
    
    $.ajaxFileUpload
    (
      {
        url:'fileUploadServlet',//用于文件上传的服务器端请求地址
        secureuri:false,//一般设置为false
        fileElementId:'file',//文件上传空间的id属性 <input type="file" id="file" name="file" />
        dataType: 'json',//返回值类型 一般设置为json
        success: function (data, status) //服务器成功响应处理函数
        {
          //alert(data.message);//从服务器返回的json中取出message中的数据,其中message为在struts2中定义的成员变量
          $('#myspan').html(data.message);
          if(typeof(data.error) != 'undefined')
          {
            if(data.error != '')
            {
              //alert(data.error);
              $('#myspan').html(data.message);
            }else
            {
              //alert(data.message);
              $('#myspan').html(data.message);
            }
          }
        },
        error: function (data, status, e)//服务器响应失败处理函数
        {
          //alert(e);
          $('#myspan').html(e);
        }
      }
    )
    
    return false;
 
  }
  </script>
  </head>
  <body>
    <img src="images/loading.gif" id="loading" style="display: none;">
    <span style="color: red;" id="myspan"></span><br/>
    <input type="file" id="file" name="file" />
    <br />
    <input type="button" value="上传" onclick="return ajaxFileUpload();">
    <a href="fileDownLoadServlet?filename=通讯录.xls">哈哈,测试文件下载</a>
  </body>
</html>

需要注意的是:在使用ajaxFileUpload基于servlet上传时需要设置response.setContentType("text/html");尽管dataType: 'json'设置为json仍要设置response.setContentType("text/html");否则获取不到服务器端返回的数据以及会弹出一个对话框。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。