用JavaBean实现文件上载(6)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

用JavaBean实现文件上载(6)

现在,我们首先来看看提取文件内容的代码。

文件路径包含在“Content-Disposition”的后面。为提取文件路径和文件名字,doUpload方法调用了setFilename私有方法。setFilename方法提取出文件路径和文件名字信息,然后把它们赋值给filepath和filename域。调用setFilename方法之后,filename域应该不再是null。假如此时filename域仍然是null,则说明碰到了问题,doUpload方法直接返回。

if (filename==null)

return;

“Content-Disposition”行之后的下一行是内容类型行。因此,doUpload方法接着调用readLine方法,然后调用setContentType私有方法。setContentType方法和setFilename方法相似,它从原始字节数据中提取出上载文件的内容类型并保存到contentType域。

紧接内容类型行的下一行是空行,因此程序再调用了一次readLine方法。

i = in.readLine(line, 0, 128);

接下来开始了真正的文件内容。我们先应该做好通过PrintWriter对象把文件写入磁盘的预备。

PrintWriter pw = new PrintWriter(new BufferedWriter(

new FileWriter(

( savePath==null? "" : savePath ) + filename

)));

上载文件保存到哪个位置取决于savePath域是否已经设置。假如savePath域没有设置,它的值是null,则文件将被保存到默认目录;假如savePath域已经设置,它的值不是null,则上载的文件被保存到它所指定的目录。

然后我们就可以提取文件的内容。具体方法是使用while循环,每次循环读入一行内容并通过PrintWriter的输出方法把它写入磁盘。但我们知道,文件的最后一行包含两个回车换行符号,所以保存到磁盘的字节数据不应该包含这两个字符。因此,假如读入的行不是文件的最后一行,我们把所有读到的字节数据写入磁盘;假如读入的行已经是文件的最后一行,写入磁盘的字节数据要减去最后两个字符。

然而,我们并不知道文件的大小,我们只知道紧接文件内容的下一行又是一个分界符;或者,假如文件是最后一个Html表单元素,接下来的一行是分界符加上两个短划线字符。因此,只要检查下一行内容是否是分界符,我们就知道了何时应该结束while循环。这就是前面说分界符很重要的原因,在这里我们必须用到分界符。

虽然我们可以读取下一行内容然后用startsWith方法检查它是否是一个分界符,然而,由于字符串操作的开销非常大,为了减少字符串操作,我们比较readLine读入的字节数组的长度。后者应该等于boundaryLength + 2;或者,假如它是HttpServletRequest对象中的最后一行,由于多出了最后两个短划线字符,它应该等于boundaryLength + 4。由于一行内容即使不是分界符也可以和分界符一样长,当长度匹配之后我们又将它与分界符比较。这就是前面提到boundaryLength很重要的原因了。

整个处理过程的实现代码如下:

while (i != -1 && !newLine.startsWith(boundary)) {

i = in.readLine(line, 0, 128);

if ((i==boundaryLength+2 i==boundaryLength+4)

&& (new String(line, 0, i).startsWith(boundary)))

pw.print(newLine.substring(0, newLine.length()-2));

else

pw.print(newLine);

newLine = new String(line, 0, i);

}

把文件内容保存到磁盘之后,我们关闭了PrintWriter。

pw.close();

非文件的表单元素也可以用类似的方法提取。不同之处在于,此时我们不再把数据写入磁盘,而是把名字-值对保存到Dictionary对象。

fields.put(fieldName, fieldValue.toString());

byte[] line = new byte[128];

(全文完)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航