Web上传文件

摘要:
web文件以POST模式上传,FORM的entype属性需要设置为multipart/FORM数据。需要设置此参数以指定浏览器使用二进制上载。因此,servlet不能通过HttpServletRequest的getParameter()方法简单地获取文件字段和文本字段的内容。Struts集成了这个类库来上传文件。
 
客户端
     相对于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上传文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇HDU 2503 (数论,最大公约数)接口--php对接农行网上支付平台-b2b下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

对文件内容就行修改-java代码

在实际的生产中,会遇到数据库版本的不同,sql语句的语法会出现改变, 我在这次的金仓数据库中就遇到了,V8版本的建表语句跟V7版本的不一样,所以需要对里面内容进行修改  从图中我们可以看到到,这个是金仓数据库v8版本导出的建表语句,这个语句在v7版本是不能运行的 我们需要做的就是 在这分享一小段java代码,本人是个菜鸟,大家看到写得不好也请见谅! 首...

winform 对话框、打印框

winform 对话框控件 1、打开文件对话框(OpenFileDialog)  2、保存文件对话框(SaveFileDialog)  3、字体对话框(FontDialog)  4、颜色对话框(ColorDialog) 5、打开文件夹对话框 FolderBrowserDialog public Form1() {...

pandas 2 选择数据

from __future__ import print_function import pandas as pd import numpy as np np.random.seed(1) dates = pd.date_range('20130101', periods=6) df = pd.DataFrame(np.random.randn(6, 4...

网络知识收集

最近学习Ravello虚拟化,遇到一些和网络相关的知识,收集后整理如下: L2其实是指七层网络协议中的第二层数据链路层,它的传输是以mac地址为基础L3指网络层:是以ip地址为基础网络层属于OSI中的较高层次了,从它的名字可以看出,它解决的是网络与网络之间,即网际的通信问题,而不是同一网段内部的事。网络层的主要功能即是提供路由,即选择到达目标主机的最佳...

script执行顺序

一、head区的script会优先于body区的script执行 Copy code 实例:Head区script代先于body区的script执行 二、关于变量,与书写的顺序有关,必须先声明才可引用: 三、关于函数的定义与执行: 1.如果函数的定义与函数的执行,是位于同一Script标签内,则函数的执行与二者位置顺序无关,即以下两则代码都能正常执行:...

UI设计教程学习分享:APP布局

一、宫格布局 这种APP信息布局方式也是我们目前最常见的一种方式,也是符合用户习惯和黄金比例的设计方式,最知名的就是锤子手机的界面设计。锤子手机界面设计欣赏知名的APP设计采用的九宫格、六宫格等方式布局有:携程APP、途牛APP、支付宝APP等等。 九宫格是一种比较古老的设计,它最基本的表现其实就像是一个三行三列的表格。 采用宫格布局的优势: 非常方便...