客户端
     相对于FTP文件上传,Web文件上传速度慢一些,但使用方便,不需要客户端,而且权限比FTP容易控制。
Web文件上传采用POST方式,上传文件需要设置FORM的entype属性为multipart/form-data。由于上传的文件会比较大,需要设置该参数指定浏览器使用二进制上传。否则enctype属性默认为application/x-www-form-urlencoded,浏览器将使用ASCII向服务器发送数据,导致失败。
 
服务器端
     上传文件时浏览器以二进制方式发送数据,因此Servlet不能简单通过HttpServletRequest的getParameter()方法来获取文件域及文本域的内容。必须根据HTTP协议所规定的格式解析浏览器提交的Request。
     可以使用很多类库来完成解析,如SMartUpload和Apache Commons Fileupload。SmartUpload是商业类库,解析Request过程中数据存放在内存里,速度较快,但上传较大文件时会发生内存溢出。Apache Commons Fileupload 是免费的开源类库,Struts 里就集成了这个类库来实现文件上传。
 
DiskFileUpload diskFileUpload = new DiskFileUpload();
List<FileItem> list = diskFileUpload.parseRequest(request);
for(FileItem fileItem: list)
if(fileItem.isFormFileld())..//文本域
else if("file1".equals(fileItem.getFieldName()))
//服务器端文件,放在upload文件夹下
file1 = new File(this.getServletContext().getRealPath(),remoteFile.getName());
...
 
上传文件时数据将以二进制形式提交,因此Servlet用request.getParameter()等方式获取提交的文本内容,可以使用Commons-upload解析二进制数据。
 
带进度条的文件上传
 
     原理:
     服务器在处理上传文件的同时,将上传进度的信息例如文件总长度、以上传多少、传输速率等写入Session中。客户端浏览器利用Ajax技术再新开一个独立的线程从Session中获取上传进度信息,并实时显示。Ajax技术能够不刷新页面获取服务器数据。Session可看做是服务器内存,可用于存放少量的客户信息。
 
--上传监听器
 
commons-fileupload支持上传监听,只需要实现一个监听器,并把它添加到上传组件上即可。监听器需要实现它的ProgressListener接口。
 
public class UploadListener implements ProgressListener {
     private UploadStatus status;     //记录上传信息的Java Bean
     public UploadListener(UploadStatus status){this.status = status;}
     public void update(long bytesRead, long contentLength, int items){
     //上传组件会调用该方法
     status.setBuytesRead(bytesRead);     //已读取的数据长度
     status.setContentLength(contentLength);
     status.setItems(items);     //正在保存第几个文件
}}
 
添加了该监听器后,上传组件在上传文件时,会不断地回调该方法,回传这些数据。利用这些数据,就可以计算出文件上传的进度,用进度条实时显示出来。
 
处理文件上传的Servlet:ProgressUploadServlet,监听上传过程需要为ServletFileUpload安装一个监听器,然后把存有上传进度信息的UploadStatus对象放进Session。上传文件使用的是Post方法。
 
读取上传进度:以POST方式访问ProgressUploadServlet,会执行上传代码;如果以GET方式访问,会执行读取上传进度的代码。
 
显示上传进度
 
     上传文件时,如果不对表单做特别处理,提交表单后会转到另一个页面,造成页面的刷新。而且新页面显示前,浏览器会因等待而显示白屏。因此需要对表单进行处理,使提交表单后原页面内容不变,并显示进度条,指导上传完成。方法是更改Form的target属性。
<form action="servlet/ProgressUploadServlet" methos="post"
     enctype="multipart/form-data"  target="upload_iframe" onsubmit="showStatus();">
 

Web上传文件的更多相关文章

  1. 前端之web上传文件的方式

    前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ...

  2. 第九篇:web之前端之web上传文件的方式

    前端之web上传文件的方式   前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ...

  3. Web上传文件的原理及实现

    现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2 ...

  4. Java+web+上传文件夹

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/1269085759/up6-jsp-mysq ...

  5. java+web上传文件夹内的所有文件

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  6. Web上传文件的三种解决方案

    第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname =  ...

  7. web上传文件夹

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

  8. web 表单方式上传文件方法(不用flash插件)

    原理:使用表单的input type="file"标签,通过ajax提交表单请求,后台获取请求中的文件信息,进行文件保存操作 由于我测试用的做了一个上传文件和上传图片方法,所以我有 ...

  9. webAPI 上传文件 404错误(转载)

    webAPI文件上传时文件过大404错误的问题  来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...

随机推荐

  1. c 深度剖析 2

    1 while 等循环语句 1 break 和 continue的去别 2 将短的循环写在外面,长的写在里面: 3 循环嵌套尽量短 2 void void *p,为空指针类型,可以指向任何的类型 若函 ...

  2. MATLAB符号运算

    1.符号运算 使用MATLAB可以进行多项式乘除运算,也可以进行因式分解. 例1. 多项式乘除运算(x+3)3 >> syms x;>> expand((x+3)^3) ans ...

  3. php文件遍历

    <?php $dirname="shangchuan/uploads"; echo $dirname."共计大小为:".toSize(dirsize($d ...

  4. Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

    http://www.51itong.net/android-badgenumber-9789.html Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒 ...

  5. Java——函数

     ------- <a href="http://www.itheima.com" target="blank">android培训</a ...

  6. NodeJS记录

    https://nqdeng.github.io/7-days-nodejs/#3.3.4

  7. Q6: Binary Tree Preorder Traversal

    问题描述 Given a binary tree, return the preorder traversal of its nodes' values. For example:Given bina ...

  8. 关于malloc申请的动态内存的问题

    http://bbs.bccn.net/thread-331344-1-1.html #include<stdio.h>#include<stdlib.h>int main(v ...

  9. A javascript library providing cross-browser, cross-site messaging/method invocation. http://easyxdm.net

    easyXDM - easy Cross-Domain Messaging easyXDM is a Javascript library that enables you as a develope ...

  10. nodejs 任务调度使用

    使用的模块 node-schedule的使用 例子: 1:确定时间 var schedule = require("node-schedule");console.log(&quo ...