方法
前面四个public类型的方法用于返回FileUploadBean对象的私有域,它们是:getFilepath,getFilename,getContentType以及getFieldValue。
public String getFilepath()
返回filepath私有域的值。
public String getFilename()
返回filename私有域的值。
public String getContentType()
返回contentType私有域的值。
public String getFieldValue(String fieldName)
返回HTML表单中指定输入元素的值,元素的名字通过fieldName参数指定。
public void setSavePath(String savePath)
用该方法指定服务器上保存上载文件的目录的名字。
public void doUpload(HttpServletRequest request) throws IOException
doUpload是FileUploadBean类中最重要的一个方法。它的任务有二个:第一,它从HTML表单提取出输入域的名字和值并保存到Dictionary对象;第二,doUpload方法提取出上载的文件,把这个文件保存到savePath指定的路径,并分别把文件的名字、路径、内容类型赋给filename、filepath和contentType域。
private void setContentType(String s)
由doUpload方法调用。setContentType方法从原始字节数据提取出上载文件的内容类型。
private void setFilename(String s)
由doUpload方法调用。setFilename方法从原始字节数据提取出文件路径和名字。
doUpload方法的参数是Servlet/JSP容器创建的HttpServletRequest对象。HttpServletRequest对象描述了程序为了提取出HTML表单元素名字-值对以及上载文件必须处理的HTTP请求。doUpload方法首先通过HttpServletRequest对象的getInputStream方法获得ServletInputStream对象。
如前所述,每一个表单元素由分界符和一组回车换行符分隔。因此,我们可以一行一行地读入HttpServletRequest对象的内容。下面这行代码定义了一个名为line的byte数组:
然后,我们用ServletInputStream对象的readLine方法读入HttpServletRequest对象内容的第一行:
int i = in.readLine(line, 0, 128);
第一行应该是分界符,而且如果没有错误的话,它的长度应该大于3。如果它的长度小于3,我们可以认为出现了错误,doUpload方法应该立即返回:
if (i < 3)
return;
分界符和分界符的长度都非常重要,从本文后面你可以看到这一点。分界符由一组回车换行符结束,因此它的实际长度要比readLine方法返回的字节数少2。
int boundaryLength = i - 2;
丢弃byte数组line的最后2个回车换行符即可获得分界符:
String boundary = new String(line, 0, boundaryLength);
接下来,fields域被实例化成Hashtable对象。这个Hashtable对象将用来保存HTML表单元素的名字/值对。
fields = new Hashtable();
由于已经有了分界符,接下来我们就可以开始提取出表单元素的值。具体方法是用一个while循环按行读入HttpServletRequest对象的内容,直至遇到内容结束readLine方法返回-1为止。所有的表单元素都以分界符开始,后面跟上“Content-Disposition”行,这一行由下面这些字符开始:
Content-Disposition: form-data; name=
表单元素有两种类型:文件,非文件(普通的表单元素,如TEXT或者HIDDEN元素)。这两种表单元素的区别在于文件元素包含字符串“filename="filename"”。由此,我们可以利用该信息把文件和非文件的表单输入元素区别开来,代码如下:
if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
if (newLine.indexOf("filename=\"") != -1) {
// 文件型表单输入元素
// 这里加上提取文件的代码
. . .
}
else {
// 普通表单输入元素
// 这里加上提取表单元素的代码
. . .
}
}
现在,我们首先来看看提取文件内容的代码。
文件路径包含在“Content-Disposition”的后面。为提取文件路径和文件名字,doUpload方法调用了setFilename私有方法。setFilename方法提取出文件路径和文件名字信息,然后把它们赋值给filepath和filename域。调用setFilename方法之后,filename域应该不再是null。如果此时filename域仍旧是null,则说明遇到了问题,doUpload方法直接返回。
- 2006-12-24用JavaBean实现文件上载(一)
- 2006-12-24用JavaBean实现文件上载(一)请求分析
- 2006-12-24用JavaBean实现文件上载(三)属性
- 2006-12-24用JavaBean实现文件上载(二)上载文件
- 2006-12-24用JavaBean实现文件上载(二)
- 2006-12-24用JavaBean实现文件上载(五)应用实例
热点搜索
热点文章






