P.S. HTML5经过了W3C的8年努力,终于正式推广了。这次升级最大的就是升级了XMLHTTPRequest,让它变成了XMLHTTPRequest Level II(这有啥奇怪的?)。这个对象现在非常强大,可能会让所有使用jQuery的人全部重新拾起HTML原生的ajax技术。

闲话扯到这,接着是主题:我们今天要实现的就是下面的效果:

这里面文件名、文件大小和MIME都是在选择文件时读取和现实,然后点击上传之后,上传进度实时显示,最后弹出右边的对话框确认文件信息(当然这里我为了方便直接把文件信息压到POST请求里面了,否则可能乱码,你也可以试试服务器端直接读取)。

接着,看到了这个强大的效果,我们简单地分析以下思路。

1、我们首先确定实现方式:Javascript将会显示在客户端显示进度(用的是XMLHTTPRequest Level II的几个新的Event),然后同时上传文件信息和文件本身,当然是异步的。

2、服务器端用一个servlet就行,这里使用commonfileupload接受上传。

然后看一下新的XMLHTTPRequest Level II,看看如何监视这一过程。

选择文件这里看到了一个onchange事件,这不是一个新事件,但在HTML5标准中被重新定义了,被用于文件被选择的时候调用。

function fileSelected() { //文件选择更改时调用的事件

var file = document.getElementById(‘fileToUpload‘).files[0]; //获得文件上传信息

if (file) { //如果用户选择了文件(没有选择的话,file就是null或是undefined,这样可以判断)

var fileSize = 0; //文件大小

if (file.size > 1024 * 1024) //如果文件大小大于1MB

fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100)

.toString()+ ‘MB‘; //转换文件大小并以MB单位显示

else

//否则

fileSize= (Math.round(file.size * 100 / 1024) / 100).toString()+ ‘KB‘; //否则用KB单位显示

document.getElementById(‘fileName‘).innerHTML = ‘ ‘ + file.name; //显示文件名信息

document.getElementById(‘fileSize‘).innerHTML = ‘ ‘ + fileSize; //显示文件大小信息

document.getElementById(‘fileType‘).innerHTML = ‘ ‘ + file.type; //显示文件MIME信息

}

}

这个注释不是我加的,我也不清楚是谁加的……但是大家应该能看懂了。

function uploadFile() { //点击上传按钮时的时间

var fd = new FormData(); //FormData是Html5的新增类

fd.append("file", document.getElementById(‘fileToUpload‘).files[0]); //向表单数据添加文件主体

var file = document.getElementById(‘fileToUpload‘).files[0]; //获得文件主体

var xhr = new XMLHttpRequest(); //初始化ajax请求

xhr.upload.addEventListener("progress", uploadProgress, false); //HTML5的新的事件,上传进度改变时,只能在有文件上传的情况下调用

xhr.addEventListener("load", uploadComplete, false); //老事件,上传完成后

xhr.addEventListener("error", uploadFailed, false); //出错时

xhr.addEventListener("abort", uploadCanceled, false); //中断时

var caption=document.getElementById("caption").value; //标题(和文件上传无关紧要)

fd.append("filename", file.name); //文件名添加到表单数据

fd.append("filesize", file.size); //文件尺寸添加到表单数据

fd.append("filetype", file.type); //MIME添加到表单数据

fd.append("caption", caption); //标题添加到表单数据

xhr.open("POST", "FileUpload",true); //准备上传

//xhr.setRequestHeader("Content-Type", "multipart/form-data"); //这句千万不能有!!!我也不知道为什么……

xhr.send(fd); //发出请求

}

点击上传按钮之后就是这段代码,FormData也是新加的对象,用于存储表单数据(某人加的注视应该够明白了……)。

接着我们看后台,后台使用commonfileupload接收(貌似说过了……),先把代码贴出来:

packageUpload;importjava.io.File;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.Iterator;importjava.util.List;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.FileItemFactory;importorg.apache.commons.fileupload.FileUploadException;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;importorg.apache.commons.fileupload.servlet.ServletFileUpload;importLog.LogManager;public class FileUpload extendsHttpServlet {/*** Constructor of the object.*/

publicFileUpload() {super();

}/*** Destruction of the servlet.
*/

public voiddestroy() {super.destroy(); //Just puts "destroy" string in log//Put your code here

}/*** The doPost method of the servlet.

*

* This method is called when a form has its tag value method equals to post.

*

*@paramrequest the request send by the client to the server

*@paramresponse the response send by the server to the client

*@throwsServletException if an error occurred

*@throwsIOException if an error occurred*/

public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {try{

request.setCharacterEncoding("UTF-8");

DiskFileItemFactory fif=newDiskFileItemFactory();

fif.setSizeThreshold(1024*1024);

ServletFileUpload sfu=newServletFileUpload(fif);

sfu.setSizeMax(1024*1024*1024);

List items=null;try{

items=sfu.parseRequest(request);

}catch(FileUploadException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

Iterator iter=items.iterator();

String filename="";

String filesize="";

String filetype="";

String caption="";

FileItem fi=null;while(iter.hasNext()) {

FileItem item=(FileItem) iter.next();if(item.isFormField()) {

String name=item.getFieldName();if(name.equals("filename")==true){

filename=item.getString("UTF-8");

}else if(name.equals("filesize")==true){

filesize=item.getString("UTF-8");

}else if(name.equals("filetype")==true){

filetype=item.getString("UTF-8");

}else if(name.equals("caption")==true){

caption=item.getString("UTF-8");

}

}else{

fi=item;

}

}

ServletContext application=getServletContext();

String path=(String) application.getAttribute("datapath")+"uploadpath"+application.getAttribute("systempi")+filename;

File f1=newFile(path);try{

fi.write(f1);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

response.setContentType("text/html; charset=UTF-8");

PrintWriter out=response.getWriter();

out.println("你上传了一个文件到服务器,下面将核实这些信息:");

out.println("1、文件名:"+filename);

out.println("2、文件大小:"+filesize);

out.println("3、文件MIME类型:"+filetype);

out.println("如果信息全部正确,说明文件成功上传了!");

String sqls1="";

LogManager.log("一个文件上传请求已经被受理!文件存储于:"+path);

out.flush();

out.close();

}catch(Exception e) {

LogManager.err(e.toString());

}

}/*** Initialization of the servlet.

*

*@throwsServletException if an error occurs*/

public void init() throwsServletException {//Put your code here

}

}

还挺简单的,对吗?处理HTML5的上传请求和处理以前版本的上传请求基本一样,唯一需要注意的是:原来是你来拼接请求,所以说,位置由你决定,现在FormData拼接请求的字符串中项目的顺序和append的顺序有关,所以别搞错了(貌似我就搞错了,先添加了文件,然后在后台补救了一下……)。

基本上就这些代码,然后就是添加文件信息到数据库什么的,具体上传步骤查查commonfileupload的api好了。

整个项目不方便让大家下载,但这是一个OJ项目里面的,有兴趣的关注一下进入项目的git。另外如果转载的话,注明一下,谢谢!

原文:http://www.cnblogs.com/zhangyutong926/p/4194726.html

j2ee html5,HTML5+J2EE实现文件异步上传相关推荐

  1. html5 上传图片模板,HTML5实现图片文件异步上传

    ,过现前个能文使近记接的端问对字用近记接 利用HTML5的新特点做文件异步上传非常简单方便,本文主要展示JS部分,html结构.下面的代码并未使用第三发库,如果有参照,请注意一些未展现出来的代码片段. ...

  2. java文件异步上传_[Java教程]原生javascript实现文件异步上传

    [Java教程]原生javascript实现文件异步上传 0 2017-10-25 19:00:06 效果图: 代码:(demo33.jsp) demo33.jsp名称文件确定 本文网址:http:/ ...

  3. 源生ajax同步异步请求,源生JS怎样实现文件异步上传

    这次给大家带来源生JS怎样实现文件异步上传,源生JS实现文件异步上传的注意事项有哪些,下面就是实战案例,一起来看一下. 名称 文件 确定 function ajaxUploadFile() { var ...

  4. 文件异步上传使用虚拟滚动el-table-virtual-scroll加载数据

    需求 最近在写一个批量导入数据的功能,需要通过上传文件异步导入调接口,将后台返回Excel文件里的数据不做分页用列表展示出来,再加上需要在列表嵌入输入框,所以加载大量数据渲染的时候要加载很久,需要用到 ...

  5. java文件异步上传_java 异步上传文件

    我们的java上传文件,需要form同步上传,并且需要设置enctype为multipart/form-data. 如果将form使用ajax异步提交的话,将会报错说enctype不是multipar ...

  6. webpy+uploadify实现文件异步上传

    Uploadify的官方文档见链接:点击打开链接 程序结构图 源代码 $def with () <!--file_upload.html--> <html lang="zh ...

  7. tp5文件异步上传入库+七牛云+预览图

    七牛云存储前提 composer require qiniu/php-sdk 然后七牛云官网 注册 注册 注册!!!! HTML 图片添加页面 <body> <form enctyp ...

  8. tp5多文件异步上传+七牛云+预览图

    html 前端页面 <form enctype="multipart/form-data" id="form"><input type=&qu ...

  9. vue method ajax上传文件,前端上传文件追根溯源_和_antd_vue上传文件实例

    背景 平,过现前个能文使近记接的端问对字用近记接时工作中经常会遇到需要上传文件的情况,如果你用ant design 或者element ,它们都提供了上传的组件. 我们分别来看一下element 和 ...

最新文章

  1. ASP.NET 2.0的异步页面刷新真给劲
  2. python函数基础和装饰器
  3. ORA-00907: 缺失右括号问题整理解决
  4. 机器学习研究今年谁最火?几何深度学习成最大赢家,Reddit为提名选手吵成一团...
  5. Eclipse搭建Mybatis框架
  6. 1.VMware安装3个ubuntu14.05
  7. Java继承_java继承
  8. laravel5.5使用sendCloud邮件服务
  9. linux下汇编语言开发总结
  10. ajax 同步怎么回调,Ajax jquery同步回调成功
  11. Linux Socket C语言网络编程:UDP Socket
  12. 阿里 AI 研究成果入选国际顶会 ICML 2020,AI 推理速度提升 3 倍
  13. 我们应该如何(以及为什么)要将Typescript与Express、nodejs一起使用(译文)
  14. Codeforces Round #510 (Div. 2) AB By cellur925
  15. matlab与数学模型相结合例题,数学知识、数学建模、现代数学软件关系 与结合...
  16. 【通信协议】IIC通信协议详解
  17. mybatis 文档 学习
  18. 计算机软件考试大纲,求计算机软件资格考试大纲和复习资料
  19. 大数据工程师要学的编程_每个数据工程师都应了解的ml编程技巧,第2部分
  20. python风格logo_Python十分钟制作属于你自己的个性logo

热门文章

  1. 16位cpu 移位处理
  2. linux设置开机自启动
  3. [MetalKit]34-Working-with-memory-in-Metal内存管理
  4. 基于CentOS 6.8平台最新源代码包编译安装企业版MariaDB数据库
  5. openstack 网络
  6. JSP页面空指针异常调错办法之weblogic
  7. web前端技术杂谈--css篇(1)--浅谈margin(续)
  8. 苹果免费Mac OS X和办公软件动了谁的奶酪
  9. 30个使用jQuery打造的世界级一流网站
  10. Windows7 中配置IIS7的方法(HTTP 错误 404.3 - Not Found)