客户端
     相对于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. 拖放API

    拖放功能是电脑用户认为理所应当能够“顺畅运行”的功能,我们有数种方法在浏览器中启用此功能.Windows Internet Explorer 9 和早期版本的 Windows Internet Exp ...

  2. Android概述(思维导图)

  3. 控制文本和外观------CSS Binding(CSS类名绑定)

    <style> .myColor{color:red;font-size:13px} .yourColor{color:green;font-size:34px}</style> ...

  4. 异步IO/数据库/队列/缓存

    同步与异步的性能区别  mport gevent def task(pid): """ Some non-deterministic task ""& ...

  5. JAVA 新闻

    Oracle已对Java失去兴趣?Java社区能否扭转乾坤? http://news.cnblogs.com/n/549566/ http://mp.weixin.qq.com/s?__biz=MjM ...

  6. EDIUS删除创建的工程预设的教程

    自从第一次启动EDIUS 8,创建了一个工程预设,之后每次启动软件都会出现,但创建的预设又用不着了,如何删除呢?下面,小编就 给大家演示如何正确删除EDIUS 8工程预设. 1.启动软件,点击设置菜单 ...

  7. SQL : 在SQL Server 2008(Or Express)中如何Open并编辑数据表【转】

    来源:http://www.cnblogs.com/wsdj-ITtech/archive/2011/04/28/2031601.html 通常在SQL Server 2005中,我们可以通过SQL ...

  8. docker 使用redis

    1. 安装 centos 7 yum install  docker 2. 启动 修改配置: nano  /etc/sysconfig/docker 添加一下信息: OPTIONS='--selinu ...

  9. .net 实现 URL重写,伪静态(方法一)

    一,获得Mircosoft URLRewriter.dll(注意:此dll文件大小约为20KB,网上有8Kb的是不完整的文件,会报错) 二,在项目中该dll文件:添加引用(可以直接拷贝放入Bin文件夹 ...

  10. 【转】Android中JNI的使用方法

    Android中JNI的使用方法 首先看一下Android平台的框架图:(网上盗用) 可以看到Android上层的Application和ApplicationFramework都是使用Java编写, ...