...<br>
...<br>
...<br>
...<br>
...<br>
解决方案 »
- 求助,AXIS2的JBOSS找不到ENDPOINT问题
- 关于多线程断点续传的一个问题
- 如何实现dtree右键菜单
- 急问!谁使用过org.apache.commons.net.ftp.FTPClient类,如何获得给定服务器文件的信息
- JSP如何向MYSQL的BLOG字段插入图片,我的代码有什么问题,帮帮忙吧!
- Eclipse运行jsp问题..急...在线等
- dw 连接mysql 报错 没有 org/gjt/mm/mysql/driver
- 怎样用jsp的application页面,可以通过刷新来在网页计数
- 大家帮忙看看这一小段代码(在线)
- 日期字符串“2003-12-2”怎么得到月日
- 如何在<html:form>里嵌套<html:form>,嵌套<html:form>时submit的逻辑顺序是怎么样的?
- javascript的输入可否转化为url的输入?
while (st.hasMoreTokens()) {
println(st.nextToken());
} prints the following output: this
is
a
test
while (st.hasMoreTokens()) {
println(st.nextToken());
}
通用上载组件的原理及实现
原创:东风汽车集团公司 王思龙
JSP/SERVLET中关于文件上传的讨论已经很久了,网上的例程也很多,但大多都不系统,且限制很多,不能作为一个通用组件拿来既用,所以对大多数人来讲,仍然是一个很头疼的问题,究其原因,关键是JSP/SERVLET中并没有给出一个实现文件上传的标准方法,本文拟从原理的角度来系统阐述JSP/SERVLET的上传原理,并给出一个标准实现方法。 JSP/SERVLET上载的难点 1、支持任意格式、任意数量的文件上载;2、上载控制的实现;3、表单信息的取得;4、“即插即用”的应用方法;我个人认为,制约通用 上载组件的实现主要是这四个难点。 JSP/SERVLET上传的原理 JSP/SERVLET文件 上载是通过ServletInputStream类来实现的,ServletInputStream类是java.io.InputStream的一个扩展抽象类,实质上也是一个输入流,通过ReadLine方法从Request端一行一行读取,可见,JSP/SERVLET上载根本上是用流来实现的,理解了这个就不难理解整个 上载的原理。ServletInputStream实现文件 上载必须采用HTTP POST 或者HTTP PUT协议,HTTP GET协议只能传递很少的数据,是不能实现文件上载的。 下面我们来看一下上传的数据流的结构,首先要在BROWSER端给出一个请求,我们的请求如下(文件名为test1.jsp): <%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>文件上载</title>
</head>
<body>
<form action="test2.jsp" enctype="MULTIPART/FORM-DATA" method=post>
说明一: <input type="text" name="explain1" />
<br />
说明二: <input type="text" name="explain2" />
<br />
请选择上载文件1 <input type="file" name="file1" />
<br />
请选择上载文件2 <input type="file" name="file2" />
<br />
说明三: <input type="text" name="explain3" />
<br />
<input type="submit" value=" 上 载 " />
</form>
</body>
</html> 显示如下: 说明一:
说明二: 请选择上载文件一: 请选择上载文件二: 说明三:
在上载请求页中混杂了表单的三个输入框,及两个上载文件,当然输入框可以更多、更杂,可以有选择框、单选及多选按钮,待上传的文件也可以有三个、四个或所需要的更多。 action="test2.jsp"表示表单将提交到"test2.jsp",另外注意表单属性中必须要有这句:enctype="MULTIPART/FORM-DATA",enctype指定 Form 输入资料的编码方式,“method”属性必须为“post”,这样表单才能提交大量数据,也表示本表单的数据传递将用流操作,“method=get”表示数据将通过地址栏进行传递,虽然方便快捷,但只适合很少的数据量。 响应端“test2.jsp”页面如下:<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>文件上载</title>
</head>
<body>
<jsp:useBean id="upBean" scope="page" class="com.upload.UpBean"/>
<%
upBean.doUpload(request);
out.println("上载已完成,请查看输出文件");
%>
</body>
</html> test2.jsp收到请求后,调用一个java bean执行doUpload(request)操作,本操作将完成流(unicode格式)的接收并不做任何处理地将流顺序写入一个文本文件里,读写操作中用了一个缓冲区byte[] readByte,用了一个ServletInputStream 的一个方法readLine(byte[] b, int off,int len)方法读取流,请大家注意,ServletInputStream 流的readLine方法是一次读入指定大小的行,java bean (UpBean.java)代码如下: