commons-fileupload+struts2报错

很奇怪的问题,在本地测试的从来没有报这个错误,上传服务器之后竟然一直报这个错误,不过上传也是成功的。

 

报错代码:

 

[Log] 2012-09-25 22:09:23,426 - ERROR -35293923 [catalina-exec-16] com.opensymphony.xwork2.util.logging.commons.CommonsLogger.error(CommonsLogger.java:27) - Unable to parse request
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:367)
at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse(JakartaMultiPartRequest.java:93)
at org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.<init>(MultiPartRequestWrapper.java:75)
at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:663)
at org.apache.struts2.dispatcher.FilterDispatcher.prepareDispatcherAndWrapRequest(FilterDispatcher.java:327)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:367)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.shaiyaya.filter.CharacterAllEncodingFilter.doFilter(CharacterAllEncodingFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.shaiyaya.filter.LoginFilter.doFilter(LoginFilter.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:354)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
at java.io.InputStream.read(InputStream.java:85)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
... 28 more

 上传action:

 

String message;
        if (fileName == null) {
            message = "未上传图片!";
            request.setAttribute("message", message);
            return "emptyPic";
        }
        String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (",jpg,jpeg,gif,bmp,png,".indexOf("," + extension.toLowerCase()
                + ",") < 0) {
            message = "只允许上传jpg,jpeg,gif,bmp,png格式的图片";
            request.setAttribute("message", message);
            return "errorType";
        }
        User user = (User) request.getSession().getAttribute("user");
        if (user == null) {
            return "timeOut";
        }
        if (upload.length() > 2048000) {
            message = "图片大小超过了2M";
            request.setAttribute("message", message);
            return "overSize";
        }
        String baseDir = "/AVATAR_IMG/";
        String realBaseDir = ServletActionContext.getServletContext()
                .getRealPath(baseDir);
        File baseFile = new File(realBaseDir);
        if (!baseFile.exists()) {
            baseFile.mkdir();
        }
        String fileFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());// 按天存入
        /* 文件存储在容器中的绝对路径 */
        String saveFilePath = ServletActionContext.getServletContext()
                .getRealPath(baseDir + fileFolder + "/");
        File fileDir = new File(saveFilePath);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }
        /* 重命名文件 */
        String random = UUID.randomUUID().toString();
        fileName = random + "." + extension;
        
        BufferedImage oldBufferedImage = ImageIO.read(upload);
        int old_width = oldBufferedImage.getWidth();
        int old_height = oldBufferedImage.getHeight();
        int new_width = 100;
        int new_height = 100;  
        int new_width2 = 40;
        int new_height2 = 40;
        int new_width3 = 25;
        int new_height3 = 25;
        
        //100x100
        double sx = (double) new_width / old_width;
        double sy = (double) new_height / old_height;
        // 等比缩放
        if (sx > sy) {
            sx = sy;
            new_width = (int) (sx * old_width);
        } else {
            sy = sx;
            new_height = (int) (sy * old_height);
        }
        BufferedImage newBufferedImage;
        FileOutputStream bioNew;
        JPEGImageEncoder encoder;
        File newFile;
        try{
            newFile= new File(saveFilePath + "/" + fileName);
            newBufferedImage = new BufferedImage(new_width, new_height,BufferedImage.TYPE_INT_RGB);
            newBufferedImage.getGraphics().drawImage(
                oldBufferedImage.getScaledInstance(new_width, new_height,Image.SCALE_AREA_AVERAGING), 0, 0, null);
            bioNew = new FileOutputStream(newFile); 
            encoder = JPEGCodec.createJPEGEncoder(bioNew);
            encoder.encode(newBufferedImage);// 进行编码
        }catch(Exception e){
            log.error("upload avatar error 100x100:"+e.getMessage());
        }
        
        //45x45
        sx = (double) new_width2 / old_width;
        sy = (double) new_height2 / old_height;
        if (sx > sy) {
            sx = sy;
            new_width2 = (int) (sx * old_width);
        } else {
            sy = sx;
            new_height2 = (int) (sy * old_height);
        }
        try{
            newFile = new File(saveFilePath + "/" + fileName+"_40x40.jpg");
            newBufferedImage = new BufferedImage(new_width2, new_height2,BufferedImage.TYPE_INT_RGB);
            newBufferedImage.getGraphics().drawImage(
                oldBufferedImage.getScaledInstance(new_width2, new_height2,Image.SCALE_AREA_AVERAGING), 0, 0, null);
            bioNew = new FileOutputStream(newFile); 
            encoder = JPEGCodec.createJPEGEncoder(bioNew);
            encoder.encode(newBufferedImage);
        }catch(Exception e){
            log.error("upload avatar error 45x45:"+e.getMessage());
        }
        
        //25x25 
        if (new_width3 > old_width) {
            new_width3 = old_width;
        }
        if (new_height3 > old_height) {
            new_height3 = old_height;
        }
        try{
            newFile = new File(saveFilePath + "/" + fileName+"_25x25.jpg");
            newBufferedImage = new BufferedImage(new_width3, new_height3,BufferedImage.TYPE_INT_RGB);
            newBufferedImage.getGraphics().drawImage(
                oldBufferedImage.getScaledInstance(new_width3, new_height3,Image.SCALE_AREA_AVERAGING), 0, 0, null);
            bioNew = new FileOutputStream(newFile); 
            encoder = JPEGCodec.createJPEGEncoder(bioNew);
            encoder.encode(newBufferedImage);// 进行编码
            bioNew.close();
        }catch(Exception e){
            log.error("upload avatar error 25x25:"+e.getMessage());
        }
        
        储存...
poterban
放牛二班长 log就是这样 commons-fileupload 1.2.1 tomcat6.0.18
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian log是全的吗 没有其他的了? fileupload版本 及 tomcat版本
大约 7 年之前 回复

6个回答

[url]http://stackoverflow.com/questions/1586843/apache-commons-fileupload-tomcat-cant-cope-with-out-flush[/url]

你服务器上的tomcat版本更新到至少6.0.20 试试。估计你本地是高版本

poterban
放牛二班长 明白了 很感谢!
大约 7 年之前 回复
jinnianshilongnian
jinnianshilongnian 这是不可能的 一个session只有一个MaxInactiveInterval 默认是在web.xml配置的30min 你修改了后就是你现在这个3秒 你可以这么干 M{ value expireTime 过期时间 } 这样每次拿到这个数据判断是否过期
大约 7 年之前 回复
poterban
放牛二班长 搭车一下: 我在web.xml中已经设这session的timeout为30min,在jsp中又用到session.setAttribute("test","test");session.setMaxInactiveInterval(3);测试3秒过期,我怎样设置这个测试的session才让他不影响我当前的登陆的session也变成3秒?
大约 7 年之前 回复
poterban
放牛二班长 我本地的版本也是6.0.18 不过现在我还真认为是tomcat版本的问题了
大约 7 年之前 回复

1、是不是用的双服务器,而且之间有ip映射
2、负载平衡和Tomcat的问题,你绕过负担均衡和直接访问Tomcat服务器的IP地址看看能不能解决

poterban
放牛二班长 很感谢你的资料,现在暂定为tomcat版本原因引起的了。参考jinnianshilongnian 的回复。
大约 7 年之前 回复
poterban
放牛二班长 你给的网址打不开
大约 7 年之前 回复
poterban
放牛二班长 这个目录下是有两个tomcat,不过我没配置负载均衡,就只用一个tomcat
大约 7 年之前 回复
henghanan
henghanan 另外,你看一下这个链接,看能不能帮到你: http://codeblow.com/questions/apache-commons-file-upload-stream-ended-suddenly/
大约 7 年之前 回复

貌似前台页面jsp
from 没有 enctype="multipart/form-data"属性

我错了,关键是:[ Stream ended unexpectedly ] 这个提醒我了。。
应该是你而是由于上传以后,关闭了窗口或者刷新页面,导致了上传异常
Processing of multipart/form-data request failed

poterban
放牛二班长 我上传是成功的,也没报错。
大约 7 年之前 回复
iteye_5246
iteye_5246 检查下,文件在服务器上存在不
大约 7 年之前 回复
poterban
放牛二班长 这个真没有,文件上传是成功的,没非法操作。
大约 7 年之前 回复

struts2上传文件会有一个写文件的临时目录,是否那个目录为只读的

poterban
放牛二班长 是的 我没有配置 我认为的是他会使用根目录下temp文件夹 这是报错的原因?
大约 7 年之前 回复
fang_fumin
fang_fumin 你的struts配置文件没有配置struts.multipart.saveDir
大约 7 年之前 回复
poterban
放牛二班长 这个临时的目录我没指定,它应该会自动使用默认的。 你的意思我不太明白~
大约 7 年之前 回复

我也遇到了同样的问题啊,本地都可以,到了服务器上有部分文件可以 部分不可以,也出现断开连接,求解决

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!