设为首页 收藏本站
查看: 556|回复: 0

[经验分享] Ext + org.apache.commons.fileupload上传文件

[复制链接]

尚未签到

发表于 2017-1-7 09:51:25 | 显示全部楼层 |阅读模式
在项目中一直使用struts的FormFile上传文件,后来发现这种方式存在一些缺陷:上传前后文件的大小不一致,主要取决于写入stream的时候byte数组大小的设置,
code="java"]
            byte[] temp = new byte[BUFFER_SIZE];
            BufferedInputStream bi = new BufferedInputStream(file.getInputStream(),BUFFER_SIZE);
            BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(tempPath));
            while (bi.read(temp) != -1) {
                bo.write(temp);
            }[
如果数组大小设置为1024字节,则每次写入1024字节,但是,如果在最后一次写入的时候原始文件中的字节数不到1024,这是仍然写入1024字节,这就导致在上传文件前后,文件大小不一致的问题,为了解决这个问题采用了apache的commons.fileupload上传文件,此方式在上传前后文件大小一致,至于是如何write的需要进一步研究。具体方式如下:
1. 前台ext需要设置formPanel的fileUpload属性为true,如果前台用jsp需要设置表单form的enctype="multipart/form-data"属性。
2. formPanel用submit方式提交。   
上传文件部分代码如下:
public static String upload (String dir, HttpServletRequest request)  {
DiskFileUpload fu = new DiskFileUpload();
//最多上传3G的数据   
fu.setSizeMax(1024 * 1024 * 1024 * 3);   
//超过1M的字段数据采用临时文件缓存   
fu.setSizeThreshold(1024 * 1024);   
//采用默认的临时文件存储位置   
//fu.setRepositoryPath(...);   
//设置上传的普通字段的名称和文件字段的文件名所采用的字符集编码   
fu.setHeaderEncoding("utf-8");   
//得到所有表单字段对象的集合   
List fileItems = null;
try {
fileItems = fu.parseRequest(request);
} catch (FileUploadException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}   
//处理每个表单字段   
Iterator i = fileItems.iterator();
String targetName = null;//目标文件名
while (i.hasNext()){  
FileItem fi = (FileItem) i.next();   
if (!fi.isFormField()){
try {
String pathSrc = fi.getName();//获取上传文件路径
pathSrc = new String(pathSrc.getBytes("ISO-8859-1"),"UTF-8");
if(pathSrc.trim().equals(""))   
{   
continue;   
}   
int start = pathSrc.lastIndexOf('\\');   
String tempName = pathSrc.substring(start + 1);//获取上传文件名
String fileName = DateUtils.getNowLongTime();//新的文件名
if(tempName.indexOf(".") < 0){//如果文件没有后缀
targetName = fileName;
}else{
int index = tempName.lastIndexOf(".");
targetName = fileName+tempName.substring(index);//fileName+文件后缀
}
File pathDest = new File(dir, targetName);   
fi.write(pathDest);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
fi.delete();
}
}   
}
return targetName.replace("\\", "/");
}

需要注意事项:ext的Formpanel不需设置对应的ActionForm,否则fileItems = fu.parseRequest(request);无法获取表单输入项列表,表单中的参数用request.getParameter()来获取,
struts-config.xml
    <action path="/uploadaction"
            name="TestForm"         <!–指定formbean–><!--这里不用指定-->
     type="UploadAction"
     parameter="method" >
     <forward name="success" path="/success.jsp" />
</action>
现象:在struts-config.xml文件中,如果指定了formbean——name="TestForm" ,则文件无法正确上传,UploadAction中的fu.parseRequest( request)方法返回值为null;如果去掉了说明formbean的name属性,则文件可以正常上传。
原因:struts的RequestProccessor.process已经包含了处理文件上传的方法。如果在action配置中设置了formbean ,那么在你自己的action处理request之前,struts已经在RequestProccessor.populate方法中处理了request,因此,在自己的action中就取不到上传的文件了。
处理:如果要自己在action中处理文件上传工作,那么就不要在配置文件中配置formbean。

感谢http://hi.baidu.com/xiaweizhao_java/blog/item/daa8dff856209569024f56e1.html的作者!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-324967-1-1.html 上篇帖子: mahout分析(1) org.apache.mahout.matrix 下篇帖子: 使用Apache HttpClient的健壮HTTP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表