日期:2014-05-16  浏览次数:20375 次

关于jspsmartupload组件使用的一些经验 <<jspSmartUpload上传下载全攻略>>纠错
jspSmartUpload上传下载全攻略: http://www.knowsky.com/3136.html
这则帖子介绍了这个组建的基本用法。

以下是我的一些使用经验:
1.<<jspSmartUpload上传下载全攻略>>下载的例子中如果把su.setContentDisposition(null)注释掉,那么response头中:
Content-Disposition:  filename=test.doc
Content-Type: application/x-msdownload;charset=gb2312
浏览器(如IE)会直接将下载的东西打开在内嵌的word程序中。

如果没有注释掉,则response头中:
Content-Disposition: attachment; filename=test.doc
Content-Type: application/x-msdownload;charset=gb2312
多了"attachment; ",浏览器会弹出一个对话框,让用户选择直接打开该文件还是保存下来等。

2.<<jspSmartUpload上传下载全攻略>>下载的例子中提到:

注意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。

经过试验,并不正确,即使在%><%之间加上空行、<html>等都不会出错(这些加上的东西被丢弃掉了,没有在response中返回)。原因是jsp中的out对象是个JspWriter,而JspWriter默认是处于buffer模式,且autoFlush="true",输出少量的空行、<html>等字符不足以撑满一个buffer,所以JspWriter还不会调用response.getWriter()去创建JspWriter需要关联的PrintWriter对象(参见JspWriter api doc)。而在do_download.jsp接下来的代码中,su.downloadFile()中却调用了response.getOutputStream(),输出了整个文件内容,因此jsp中的out中的内容会被丢弃而不会输出。

3.<<jspSmartUpload上传下载全攻略>>中:
SmartUpload类的getSize()方法返回的是请求内容的总长度,而不是“上传文件数据的总长度”。

4. jspsmartupload存在的问题:
(1)对中文支持的不足(文件名中含中文的文件的上传、下载等);
(2)容易出现OutOfMemoryError,因为SmartUpload类在upload()方法中会将请求的内容一次性全部读入到内存:
m_totalBytes = m_request.getContentLength();
m_binArray = new byte[m_totalBytes];
(3)功能较简单,编程实现上不够正规。

因此,不推荐再使用jspsmartupload组件,应该转而使用apache的commons fileupload, struts中的实现或一些ajax框架中的实现等。