关于uploadify上传还在进行中,onUploadSuccess返回结果为false问题

时间:2021-09-14 03:33:52
使用uploadify在项目中做上传使用,但是使用过程中发现一个问题

再上传5M以内的文件时没有任何问题,但是在上传大于5M 的文件时出现返回信息提前的问题

问题模拟:
上传大文件file_upload向后台提交信息,

后台public String uploadFile(@RequestParam("pic") CommonsMultipartFile[] pic, HttpSession request,
HttpServletResponse response) throws IOException {
接收后向指定path写入文件
调用FileUtils.uploads(pic,Propertie.dynaform,request);写入

但是在写入的过程中前台的程序就接收到返回结果了,这个很不理解是问什么。

前台
'onUploadSuccess':function(file, data, response){
            if(response){
             var loadPath = $("#filePath").val();
             if(loadPath == null || loadPath == ""){
             $("#filePath").val(data);
             }else{
             $("#filePath").loadPath = loadPath+ ","+data;
             $("#filePath").val(loadPath);
             }
            }else{
             alert("服务器异常,请稍后再试");
            }
        }
此时报错alert("服务器异常,请稍后再试");


问题:   为什么后台还在上传文件时,前台onUploadSuccess就接收到response=false了??而且后台依旧还在运行,直到上传完整文件,但是已经不能把结果返回到前台了

二楼上代码

11 个解决方案

#1


前台:

 $('#file_upload').uploadify({
     //是否自动上传 true or false
        'auto':false,
        'swf'      : '${basePath}/assets/uplodify/uploadify.swf',// uploadify.swf 文件的相对JS文件的路径
        'fileObjName':'pic',
        'onUploadSuccess':function(file, data, response){
            if(response){
             var loadPath = $("#filePath").val();
             if(loadPath == null || loadPath == ""){
             $("#filePath").val(data);
             }else{
             $("#filePath").loadPath = loadPath+ ","+data;
             $("#filePath").val(loadPath);
             }
            }else{
             alert($(".span").html());
             $(".span").html("上传失败");
             alert("服务器异常,请稍后再试");
            }
        },
        //返回一个错误,选择文件的时候触发
                'onSelectError': function (file, errorCode, errorMsg) {
                    switch (errorCode) {
                        case -100:
                            alert("上传的文件数量已经超出系统限制的" + $('#file_upload').uploadify('settings', 'queueSizeLimit') + "个文件!");
                            break;
                        case -110:
                            alert("文件 [" + file.name + "] 大小超出系统限制的" + $('#file_upload').uploadify('settings', 'fileSizeLimit') + "大小!");
                            break;
                        case -120:
                            alert("文件 [" + file.name + "] 大小异常!");
                            break;
                        case -130:
                            alert("文件 [" + file.name + "] 类型不正确!");
                            break;
                    }
                },
        'uploader':'${basePath}/demand/uploadFile',//后台处理程序的相对路径
        'removeCompleted':false
});

Controller:
@RequestMapping(value = "uploadFile", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
@ResponseBody
public String uploadFile(@RequestParam("pic") CommonsMultipartFile[] pic, HttpSession request,
HttpServletResponse response) throws IOException {
//单个上传,批量上传实际上也就是单个上传衍生版本
List<FileDto> list= FileUtils.uploads(pic,Propertie.dynaform,
request);
AttachmentEntity attachmentEntity = new AttachmentEntity();
attachmentEntity.setPath(list.get(0).getPath());
attachmentEntity.setName(list.get(0).getFilename());
attachmentEntity.setCreateTime(new Date());
attachmentMapper.insert(attachmentEntity);

return attachmentEntity.getId();

}


File:
public static List<FileDto> uploads(@RequestParam("file") CommonsMultipartFile[] files,String paths,HttpSession request){
List<FileDto> list=new ArrayList<FileDto>();
        
        for(int i = 0;i<files.length;i++){ 
        
         log.info("fileName---------->" + files[i].getOriginalFilename());  
          
            if(!files[i].isEmpty()){  
                int pre = (int) System.currentTimeMillis();  
                try {  
                    //拿到输出流,同时重命名上传的文件  
                 log.info(files[i].getOriginalFilename()); 
                 FileDto fileDto=new FileDto();
                    String str="";
                    String[] fi= files[i].getOriginalFilename().split("\\.");
                    str=fi[fi.length-1];
                    DateFormat format2 = new java.text.SimpleDateFormat("yyyyMMdd");
                    String date=format2.format(new Date());
                    //重命名上传后的文件名  
                    String fileName = date+CommonUtil.getUUID()+"."+str;  
                    //定义上传路径  
                    String path =  "/home/yeshine/"+"upload"+paths + fileName; 
                    log.info(path);
                    log.info("/home/yeshine/"+"upload"+paths);
                    File localFile = new File("/home/yeshine/"+"upload"+paths );
if (!localFile.exists()) {
localFile.mkdirs();
}
                    FileOutputStream os = new FileOutputStream(path);  
                    //拿到上传文件的输入流  
                    InputStream in = files[i].getInputStream();
                    fileDto.setFilename(files[i].getOriginalFilename());
                    fileDto.setPath("/home/yeshine/upload"+paths + fileName);
                    list.add(fileDto);
                    //以写字节的方式写文件  
                    int b = 0;  
                    while((b=in.read()) != -1){  
                        os.write(b);  
                    }  
                    os.flush();  
                    os.close();  
                    in.close();  
                    int finaltime = (int) System.currentTimeMillis();  
                    log.info(finaltime - pre);  
                      
                } catch (Exception e) {  
                    e.printStackTrace();  
                    log.info("上传出错");  
                }  
        }  
        }  
        return list;  
    } 

#2


有没有大牛在啊 关于uploadify上传还在进行中,onUploadSuccess返回结果为false问题

#3


用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。

#4


引用 3 楼 showbo 的回复:
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

#5


引用 4 楼 Dreamiy 的回复:
Quote: 引用 3 楼 showbo 的回复:

用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

不用用uploadify这个插件,用jquery.form.js插件

uploadify问题比较多,高版本firefox会获取不到文件。。

#6


引用 5 楼 showbo 的回复:
Quote: 引用 4 楼 Dreamiy 的回复:

Quote: 引用 3 楼 showbo 的回复:

用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

不用用uploadify这个插件,用jquery.form.js插件

uploadify问题比较多,高版本firefox会获取不到文件。。



好吧。。。。我去试试

#7


楼主 你的问题解决了吗?遇到和你一样的问题。。。。。

#8


是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。

#9


应该是请求超时的问题吧?

#10


本帖最后由 showbo 于 2016-09-05 10:32:51 编辑
引用 9 楼 net_lover 的回复:
应该是请求超时的问题吧?



引用 8 楼 u011630524 的回复:
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。


有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序

successTimeout    上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒

不过uploadify bug还是比较多。。还是iframe来模拟上传好点

#11


引用 10 楼 showbo 的回复:
Quote: 引用 9 楼 net_lover 的回复:

应该是请求超时的问题吧?



引用 8 楼 u011630524 的回复:
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。


有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序

successTimeout    上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒

不过uploadify bug还是比较多。。还是iframe来模拟上传好点


没想到最终就是successTimeout 解决的,之前没想过 会因为这个而不成功

#1


前台:

 $('#file_upload').uploadify({
     //是否自动上传 true or false
        'auto':false,
        'swf'      : '${basePath}/assets/uplodify/uploadify.swf',// uploadify.swf 文件的相对JS文件的路径
        'fileObjName':'pic',
        'onUploadSuccess':function(file, data, response){
            if(response){
             var loadPath = $("#filePath").val();
             if(loadPath == null || loadPath == ""){
             $("#filePath").val(data);
             }else{
             $("#filePath").loadPath = loadPath+ ","+data;
             $("#filePath").val(loadPath);
             }
            }else{
             alert($(".span").html());
             $(".span").html("上传失败");
             alert("服务器异常,请稍后再试");
            }
        },
        //返回一个错误,选择文件的时候触发
                'onSelectError': function (file, errorCode, errorMsg) {
                    switch (errorCode) {
                        case -100:
                            alert("上传的文件数量已经超出系统限制的" + $('#file_upload').uploadify('settings', 'queueSizeLimit') + "个文件!");
                            break;
                        case -110:
                            alert("文件 [" + file.name + "] 大小超出系统限制的" + $('#file_upload').uploadify('settings', 'fileSizeLimit') + "大小!");
                            break;
                        case -120:
                            alert("文件 [" + file.name + "] 大小异常!");
                            break;
                        case -130:
                            alert("文件 [" + file.name + "] 类型不正确!");
                            break;
                    }
                },
        'uploader':'${basePath}/demand/uploadFile',//后台处理程序的相对路径
        'removeCompleted':false
});

Controller:
@RequestMapping(value = "uploadFile", method = RequestMethod.POST, produces = "text/html;charset=utf-8")
@ResponseBody
public String uploadFile(@RequestParam("pic") CommonsMultipartFile[] pic, HttpSession request,
HttpServletResponse response) throws IOException {
//单个上传,批量上传实际上也就是单个上传衍生版本
List<FileDto> list= FileUtils.uploads(pic,Propertie.dynaform,
request);
AttachmentEntity attachmentEntity = new AttachmentEntity();
attachmentEntity.setPath(list.get(0).getPath());
attachmentEntity.setName(list.get(0).getFilename());
attachmentEntity.setCreateTime(new Date());
attachmentMapper.insert(attachmentEntity);

return attachmentEntity.getId();

}


File:
public static List<FileDto> uploads(@RequestParam("file") CommonsMultipartFile[] files,String paths,HttpSession request){
List<FileDto> list=new ArrayList<FileDto>();
        
        for(int i = 0;i<files.length;i++){ 
        
         log.info("fileName---------->" + files[i].getOriginalFilename());  
          
            if(!files[i].isEmpty()){  
                int pre = (int) System.currentTimeMillis();  
                try {  
                    //拿到输出流,同时重命名上传的文件  
                 log.info(files[i].getOriginalFilename()); 
                 FileDto fileDto=new FileDto();
                    String str="";
                    String[] fi= files[i].getOriginalFilename().split("\\.");
                    str=fi[fi.length-1];
                    DateFormat format2 = new java.text.SimpleDateFormat("yyyyMMdd");
                    String date=format2.format(new Date());
                    //重命名上传后的文件名  
                    String fileName = date+CommonUtil.getUUID()+"."+str;  
                    //定义上传路径  
                    String path =  "/home/yeshine/"+"upload"+paths + fileName; 
                    log.info(path);
                    log.info("/home/yeshine/"+"upload"+paths);
                    File localFile = new File("/home/yeshine/"+"upload"+paths );
if (!localFile.exists()) {
localFile.mkdirs();
}
                    FileOutputStream os = new FileOutputStream(path);  
                    //拿到上传文件的输入流  
                    InputStream in = files[i].getInputStream();
                    fileDto.setFilename(files[i].getOriginalFilename());
                    fileDto.setPath("/home/yeshine/upload"+paths + fileName);
                    list.add(fileDto);
                    //以写字节的方式写文件  
                    int b = 0;  
                    while((b=in.read()) != -1){  
                        os.write(b);  
                    }  
                    os.flush();  
                    os.close();  
                    in.close();  
                    int finaltime = (int) System.currentTimeMillis();  
                    log.info(finaltime - pre);  
                      
                } catch (Exception e) {  
                    e.printStackTrace();  
                    log.info("上传出错");  
                }  
        }  
        }  
        return list;  
    } 

#2


有没有大牛在啊 关于uploadify上传还在进行中,onUploadSuccess返回结果为false问题

#3


用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。

#4


引用 3 楼 showbo 的回复:
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

#5


引用 4 楼 Dreamiy 的回复:
Quote: 引用 3 楼 showbo 的回复:

用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

不用用uploadify这个插件,用jquery.form.js插件

uploadify问题比较多,高版本firefox会获取不到文件。。

#6


引用 5 楼 showbo 的回复:
Quote: 引用 4 楼 Dreamiy 的回复:

Quote: 引用 3 楼 showbo 的回复:

用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。


意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?

不用用uploadify这个插件,用jquery.form.js插件

uploadify问题比较多,高版本firefox会获取不到文件。。



好吧。。。。我去试试

#7


楼主 你的问题解决了吗?遇到和你一样的问题。。。。。

#8


是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。

#9


应该是请求超时的问题吧?

#10


本帖最后由 showbo 于 2016-09-05 10:32:51 编辑
引用 9 楼 net_lover 的回复:
应该是请求超时的问题吧?



引用 8 楼 u011630524 的回复:
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。


有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序

successTimeout    上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒

不过uploadify bug还是比较多。。还是iframe来模拟上传好点

#11


引用 10 楼 showbo 的回复:
Quote: 引用 9 楼 net_lover 的回复:

应该是请求超时的问题吧?



引用 8 楼 u011630524 的回复:
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。


有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序

successTimeout    上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒

不过uploadify bug还是比较多。。还是iframe来模拟上传好点


没想到最终就是successTimeout 解决的,之前没想过 会因为这个而不成功