回到了北京,过的第一个十一,但是房子太贵,买不起。租房子也负担有点困难,只能搞个蜗居,女朋友辞掉了工作跟我来北京了,但是一时还找不到合适的工作,我也知道她有点苦,但是不对我说,她知道我的压力大,不过没有关系,会好起来的。今天下午学习。
SmartUpload是个小的工具包,原来是使用Servlet来实现文件的上传(可能又点不合适)
Servlet实现文件上传的原理:
<1>在用户提交请求以后,将文件和其他的表单信息编码并上传到服务器,服务器端将上传的内容进行解码,提取HTML中的信息,将文件数据存入到磁盘或者是数据库中
<2>浏览器编码
在向服务器提交请求的时候,浏览器要将大量的数据一同提交给Server端,而提交前,浏览器需要按照服务器端可以识别的方法对提交的内容进行编码,对于普通的表单,这钟编码很简单,通常是: field1=value2&field2=value2&… ,同时Servlet的API提供了对对这种编码方式解码的支持,只需要调用ServletRequest的方法就可以获取
这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data" 的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和文件一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有 Content-Type 属性,然后就是数据本身。 这里,我们可以编写一个简单的 JSP(servlet) 来看到浏览器到底是怎样编码的。
<page contentType="text/html; charset=GBK"%>
<%@page import="java.io.*"%>
<%
System.out.println("-----");
int length = request.getContentLength();
byte[] buffer = new byte[length];
InputStream in = request.getInputStream();
int total = 0;
int once = 0;
while ((total < length) && (once >=0)) {
once = in.read(buffer,total,length);
total += once;
}
//ServletOutputStream os = response.getOutputStream();
//os.write(buffer);
//os.flush();
//os.close();
OutputStream os=new BufferedOutputStream(new FileOutputStream("F:\\Receive.log",true));
os.write(buffer,0,buffer.length);
os.flush();
os.close();
%>
下面是用IE来获取的文件头:
引用
-----------------------------7dada34409ca
Content-Disposition: form-data; name="uploadFile"; filename="C:\Documents and Settings\HP Pavilion\桌面\item.xml"
Content-Type: text/xml
这里 ---------------------------7d137a26e18 作为分界符。关于分界符的规则可以概况为两条:
除了最后一个分界符,每个分界符后面都加一个 CRLF 即 '\u000D' 和 '\u000A', 最后一个分界符后面是两个分隔符"--"
每个分界符的开头也要加一个 CRLF 和两个分隔符("-")。
浏览器采用默认的编码方式是 application/x-www-form-urlencoded ,可以通过指定 form 标签中的 enctype 属性使浏览器知道此表单是用 multipart/form-data 方式编码如:
< form action="/servlet/ReceiveServlet" ENCTYPE="multipart/form-data" method=post >
<3>提交请求
提交请求的过程由浏览器完成的,并且遵循 HTTP 协议,每一个从浏览器端到服务器端的一个请求,都包含了大量与该请求有关的信息, 在 Servlet 中,HttpServletRequest 类将这些信息封装起来,便于我们提取使用。在文件上载和表单提交的过程中,有两个指的关心的问题,一是上载的数据是是采用的那种方式的编码,这个问题的可以从 Content-Type 中得到答案,另一个是问题是上载的数据量有多少即 Content-Length ,知道了它,就知道了 HttpServletRequest 的实例中有多少数据可以读取出来。这两个属性,我们都可以直接从 HttpServletRequest 的一个实例中获得,具体调用的方法是 getContentType() 和 getContentLength() 。
Content-Type 是一个字符串,在上面的例子中,增加:
System.out.println(request.getContentType());
可以得到这样的一个输出字符串:
引用
multipart/form-data; boundary=---------------------------7d137a26e18
前半段正是编码方式,而后半段正是分界符,通过 String 类中的方法,我们可以把这个字符串分解,提取出分界符。
String contentType=request.getContentType();
int start=contentType.indexOf("boundary=");
int boundaryLen=new String("boundary=").length();
String boundary=contentType.substring(start+boundaryLen);
boundary="--"+boundary;
判断编码方式可以直接用 String 类中的 startsWith 方法判断。
if(contentType==null || !contentType.startsWith("multipart/form-data"))
这样,我们在解码前可以知道:
编码的方式是否是multipart/form-data
数据内容的分界符
数据的长度
<4>解码
解码对我们来说是整个上载过程最繁琐的一个步骤,经过以上的流程,我们可以得到一个包含有所有上载数据的一个字节数组和一个分界符,通过对 Receive.log 分析,还可以得到每个数据段中的分界符。而我们要得到以下内容:
提交的表单中的各个字段以及对应的值
如果表单中有 file 控件,并且用户选择了上载文件,则需要分析出字段的名称、文件在浏览器端的名字、文件的 Content-Type 和文件的内容。
具体解码过程也可以分为两个步骤:
- 将上载的数据分解成数据段,每个数据段对应着表单中的一个 Input 区。
- 对每个数据段,再进行分解,提出上述要求得到的内容。
有5个类:
SmartUpload.java ---上传核心类
File.java ---包装了上传的文件的一些基本信息,包括文件名称了,后缀名了,大小等
Files.java ---表示上传文件的集合,用它可以来获得上传文件的个数等
Request.java ---等同于HttpServletRequest,因为文件上传是form必须有两个固定的属性:
method="post"
enctype="miltipart/form-date"
对于enctype="miltipart/form-date"的表格,form中的input值是以二进制的形式传过去。是无法用request.getParameter();来获取表格的属性的,所以提供了这个方法来获取表格属性
SmartUploadException.java ---定义的异常类
介绍一下SmartUpload.java
初始化方法:主要是用当前页面的request,response,ServletContext来初始化SmartUpLoad类的类成员变量
有一下的几个初始化方法:
1.使用ServletConfig,HttpServletRequest,HttpServletResponse
public final void initialize(ServletConfig servletconfig, HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
throws ServletException
{
m_application = servletconfig.getServletContext();
m_request = httpservletrequest;
m_response = httpservletresponse;
}
2.使用PageContext
public final void initialize(PageContext pagecontext)
throws ServletException
{
m_application = pagecontext.getServletContext();
m_request = (HttpServletRequest)pagecontext.getRequest();
m_response = (HttpServletResponse)pagecontext.getResponse();
}
3.还有其他一个已经过时的初始化方法
可以看出上面的初始化方法没有很大的区别,异曲同工
使用上面的方法之一初始化之后,需要文件上传,smartUpload会把所有上传到的内容存放到一个字节数组中,可能是对上传小的文件有很搞的效率。
获取request的请求流的长度:
m_totalBytes = m_request.getContentLength();
使用request.getContentLength,对contentLength的解释:
Returns the length,in bytes, of the request body and made available by the input stream, or -1 if the length is not known.
分享到:
相关推荐
"SmartUpload"是一款在JSP开发中常用的Java上传组件,它允许开发者轻松地在Web应用中实现文件上传功能。这个组件以源代码的形式提供,而不是通常的预编译的JAR包,这样开发者可以更直观地理解其内部工作原理,并可以...
最近实验室做了一个项目,使用jspsmartupload来实现的文件的上传下载,原来在windows平台运行的挺好,但是后来系统移植到linux平台上,结果在上传或下载的文件名中有中文时就会出现乱码。后来查了网上一些人的解决...
**JSpsmartupload组件**是一个基于Java的上传文件解决方案,主要应用于JSP(Java Server Pages)环境中。这个组件提供了一种简单且强大的方式来处理用户通过网页上传的文件。在标题和描述中提到的,该组件的核心是用...
- 初始化SmartUpload对象:`SmartUpload smartUpload = new SmartUpload();` - 开始上传:`smartUpload.initialize(request, response);` - 接收并处理文件:`smartUpload.save("uploadPath");` 10. **学习资源*...
"SmartUpload"是一个专用于Java Web开发中的文件上传组件,主要针对JSP(JavaServer Pages)环境设计。在Web应用中,文件上传是一项常见的需求,例如用户上传个人照片、提交文档等。SmartUpload通过简化API,让...
2. **初始化SmartUpload对象**:在Servlet的`doPost`方法中,创建`SmartUpload`对象,如`SmartUpload smartUpload = new SmartUpload();` 3. **设置上传参数**:可以调用`smartUpload`对象的相关方法来设置上传限制...
`jspSmartUpload`是一个非常实用的库,它简化了处理文件上传和下载的复杂性。本文将深入探讨如何使用`jspSmartUpload`来实现这两个功能,并详细解释其工作原理和相关知识点。 首先,`jspSmartUpload`是一个基于Java...
SmartUpload是一款强大的Java上传组件,它为Web应用提供了一种高效、便捷的文件上传解决方案。在Web开发中,文件上传功能是不可或缺的一部分,无论是用户上传个人资料、分享图片,还是企业内部的数据交换,都可能...
《SmartUpload:高效便捷的文件上传与下载组件详解》 在Web应用开发中,文件上传与下载功能是不可或缺的一部分。为了简化这一过程,许多开发者选择了使用第三方组件,其中`SmartUpload`就是一个广受好评的选择。`...
- 初始化:在Servlet或JSP页面中,创建`SmartUpload`对象,如`SmartUpload smartUpload = new SmartUpload();` - 配置:设置上传文件的大小限制、类型限制等,如`smartUpload.setMaxFileSize(1024*1024*5);`限制...
SmartUpload是Java中一个常用的文件上传组件,它简化了在Web应用中处理文件上传的复杂性。本实例将深入解析SmartUpload的使用方法,并通过注解来解释关键步骤,以帮助初学者更好地理解和应用。 首先,我们需要理解...
**JSpsmartupload简介** JSpsmartupload是一个用于Java Web应用中的上传组件,它使得在JSP页面上处理文件上传变得简单。这个组件基于Servlet API,可以方便地集成到任何Servlet容器,如Tomcat、Jetty等,并且支持多...
在本文中,我们将探讨如何使用SmartUpload组件来实现文件上传功能。SmartUpload是一个免费的全功能文件上传下载组件,特别适合在JSP应用中集成以处理文件上传和下载操作。以下是关于SmartUpload的一些关键特性及其...
《SmartUpload 源码解析与使用指南》 SmartUpload 是一个强大且易于使用的Java上传组件,它提供了处理文件上传的全面解决方案。该组件的主要功能是处理用户通过表单提交的多个文件,允许开发者轻松地将文件上传到...
Struts和SmartUpload都是在Java Web开发中处理文件上传功能的常见工具,它们各自有其特点和适用场景。下面将详细介绍这两个技术,并对比它们的使用方法。 **Struts上传** Struts是Apache软件基金会下的一个开源...