1. 以下是Demo的项目结构:主要就是一个servlet3.0和一个jsp页面
  2. 由于使用的是servlet3.0,所以无需配置web.xml,以下是idnex.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% String path = request.getcontextpath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传demo</title>
<style type="text/css"> h1 { text-align: center; text-shadow: 2px 2px 2px #999; } a { text-decoration: none; position: relative; display: block; width: 100px; height: 30px; line-height: 30px; background: #EEE; border: 1px solid #999; text-align: center; background: #EEE; } input { position: absolute; border-radius: 10px; left: 0; top: 0; width: 100%; height: 100%; z-index: 999; opacity: 0; } #myDiv { margin: auto; width: 100px; height: 30px; } a:HOVER { background: red; } .fileList { width: 600px; height: 400px; overflow: auto; position: absolute; bottom: 20px; right: 20px; position: absolute; border: 1px solid blue; position: absolute; } ul { list-style: none; } ul:after { clear: both; content: ""; display: block; } ul:nth-child(odd) { background: #677077; color: #fff; } li { float: left; } </style>

</head>
<body>
    <h1>文件上传demo</h1>
    <div id="myDiv">
        <a href="javascript:;" id="fileUpload">文件上传
         <input type="file" multiple onchange="fileChange(this)" />
        </a>
    </div>
    <div class="fileList" id="fileList">
        <ul>
            <li style="width: 30%">文件名</li>
            <li style="width: 68%">上传情况</li>
        </ul>
    </div>
</body>
<script> function fileChange(fileInput) { var files = fileInput.files; var tempHtml = ""; for (var i = 0; i < files.length; i++) { var file = files[i]; tempHtml += "<ul>" + "<li style='width: 30%'>" + file.name + "</li>" + "<li style='width: 68%'><progress id='p"+i+"' max='100' value=''></progress><span id='sp"+i+"'></span></li></ul>"; fileUpload(file,i); } document.getElementById("fileList").innerHTML += tempHtml; } function fileUpload(file,index) { var formData = new FormData(); formData.append(file.name,file); var xhr = new XMLHttpRequest(); var oldUploaded=0; var curUploaded=0; var total=0; var percent=0; xhr.upload.addEventListener("progress",function(event){ var loaded=event.loaded; if(oldUploaded==0){ total=event.total; oldUploaded=event.loaded; } curUploaded=event.loaded; percent=Math.round(event.loaded/event.total*100); document.getElementById("p"+index).value=percent; }); var upSpeed=setInterval(function(){ if(oldUploaded!=0){ //得到的是一个byte值 var result=curUploaded-oldUploaded; var leave=total-curUploaded; var label=document.getElementById("sp"+index); label.innerHTML=percent+"%&nbsp;&nbsp;"+Math.round(result/(1024*1024)*100)/100+"M/S&nbsp;&nbsp;剩余"+Math.round(leave/result)+"秒"; if(total==oldUploaded&&result==0){ clearInterval(upSpeed); } oldUploaded=curUploaded; } },1000); xhr.open("post","FileUp",true); xhr.send(formData); } </script>
</html>

3.FileUp.java类代码如下:

package com.prosay.upload;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.List;

import javax.servlet.servletexception;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.diskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;

/** * 文件上传 */

@WebServlet("/FileUp") // servlet3.0的规范,使用注解无需配置web.xml
@MultipartConfig // 加上该注解标识这个servlet支持文件上传,否则request.getParts()返回空,后台无法接收到文件
public class FileUp extends HttpServlet {
    private static final long serialVersionUID = 1L;
    /** * 后台接收文件方式一,该方式需要@MultipartConfig注解 */
    public void service(HttpServletRequest request,HttpServletResponse response) throws IOException,servletexception {
        request.setCharacterEncoding("utf-8");
        String savePath = request.getServletContext().getRealPath("/myFiles");
        Collection<Part> files = request.getParts();
        for (Part file : files) {
            file.write(savePath + "/" + file.getName());
        }

    }

    /** * 后台接收文件方式二,该方式无需@MultipartConfig注解 */
    protected void doPost(HttpServletRequest request,HttpServletResponse response)
            throws servletexception,IOException {
        request.setCharacterEncoding("utf-8");
        String savePath = request.getServletContext().getRealPath("/myFiles");
        diskFileItemFactory factory = new diskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        try {
            List<FileItem> items = upload.parseRequest(new ServletRequestContext(request));
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    // System.out.println("savePath = " + savePath);
                    // System.out.println(item.getName());
                    // System.out.println(item.getFieldName());
                    item.write(new File(savePath + "/" + item.getFieldName()));
                }
            }
        } catch (Exception e) {
            e.printstacktrace();
        }

    }

}

注:上传文件测试的时候,这两种后台处理文件的方式任选其一即可,方式一简洁些,但是需要@MultipartConfig注解,而方式二就不需要该注解。

4.布署Demo到tomcat,启动tomcat以后,如果没报错,打开浏览器,访问:http://localhost:8080/0813upload/,效果如下图所示:

点击文件上传按钮,选择文件后,开始上传的效果图如下:

上传完成后,在本地磁盘的myFiles文件夹下可以看到上传成功的文件,如下图所示:

本例中需要注意的几个问题
①取消a标签onclick事件,因为实际上已经不需要a标签的onclick触发file的click了,而是直接就点击到file;
②file标签不需要再设置display:none隐藏,而是通过opacity:0让它完全透明,实际它是浮在a标签之上
③file标签设置position:absolute后要给left:0、top:0,否则file标签不会吻合覆盖a标签导致点击按钮的时候点不到file标签
④index.jsp页面html的声明要用h5的方式:,因为后面使用的进度条progress和FormData对象是h5中的新内容,h4中是没有的;<head></head>标签中还要加上<Meta http-equiv="Content-Type" content="text/html; charset=UTF-8">,否则页面会出现中文乱码
⑤在FileUp.java类中,如果使用方式一接受文件,一定不要忘记在类上面加上@MultipartConfig注解,否则Collection<Part> files = request.getParts()中的files集合就是空的;如果使用方式二来接受文件,List<FileItem> items = upload.parseRequest(request)这样写的话,items中就是空的,是取不到前台传过来的文件的,必须这样写:List<FileItem> items = upload.parseRequest(new ServletRequestContext(request)),request要通过ServletRequestContext类new出来放进去才可以,自己在网上查了好多资料都是前面那种错误的写法,后来又查了好久才找到后面这种正确的写法。在此特意总结一下,免得以后遇到走弯路了!

Ajax使用FormData对象上传文件的两种方式的更多相关文章

  1. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  2. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  3. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  4. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  5. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. ajax从JSP传递对象数组到后台的方法

    今天小编就为大家分享一篇ajax从JSP传递对象数组到后台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  7. 解决ajax返回验证的时候总是弹出error错误的方法

    这篇文章主要介绍了解决ajax返回验证的时候总是弹出error错误的方法,感兴趣的小伙伴们可以参考一下

  8. 使用AJAX完成用户名是否存在异步校验

    这篇文章主要介绍了使用AJAX完成用户名是否存在异步校验的相关资料,需要的朋友可以参考下

  9. ajax实现无刷新省市县三级联动

    这篇文章主要为大家详细介绍了ajax实现无刷新省市县三级联动的相关资料,利用三层架构实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. jQuery Ajax 实现分页 kkpager插件实例代码

    本文通过实例代码给大家讲解了jQuery Ajax 实现分页 kkpager插件功能,需要的的朋友参考下吧

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部