使用Servlet3.0和XMLHttpRequest Level 2处理文件上传

来源:互联网 发布:唐筛检查结果数据分析 编辑:程序博客网 时间:2024/05/29 18:08

今天在做作业时遇到了一个问题,场景如下:

不使用框架,不使用开源jar包,单纯使用Servlet进行文件上传操作,前台使用ajax提交的方式提交表单,表单中有文件字段。

经过思考和查证资料,整理如下:


具体的FormData的介绍:https://developer.mozilla.org/zh-CN/docs/Web/API/FormData

这里涉及到AJAX操作的一个重要的对象XMLHttpRequest,它有两个版本:XMLHttpRequest Level 1和XMLHttpRequest Level 2

XMLHttpRequest Level 1:

只支持文本数据的传输,不支持二进制文件文件的上传和读取。

没有进度提示,只能提示是否完成。

只能向同一域名的服务器发送请求。


XMLHttpRequest Level 2:

W3C组织在2008年时起草了XMLHttpRequest Level 2,它克服了前代的缺陷。

前台页面

<form method="post" action=""><input type="file" name="head"/><input type="text" name="stuid"/><input type="text" name="address"/></form>

$("form").bind("submit",function(){        var params = new FormData($(this)[0]);          var xhr = new XMLHttpRequest();        xhr.open("post","student",true);          xhr.onreadystatechange=function(){        if(xhr.readyState==4&&xhr.status==200){          var result = eval('('+xhr.responseText+')');          }        }        xhr.send(params);          return false;  });



后台

@WebServlet("/student")@MultipartConfig //必须带的注解public class StudentServlet extends HttpServlet {private static final long serialVersionUID = 1L;/** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String stuid = request.getParameter("stuid");String address = request.getParameter("address");Part part = request.getPart("head");//获取表单传递的fileString []str = part.getSubmittedFileName().split("\\.");//拆分,得到后缀String path = this.getServletContext().getRealPath("/upload");String fileName = "/"+new Date().getTime()+"."+str[str.length-1];part.write(path+fileName);//写到指定目录的文件中}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request,response);}}









0 0