再上传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;
}
$('#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
有没有大牛在啊
#3
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
#4
意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?
#5
不用用uploadify这个插件,用jquery.form.js插件
uploadify问题比较多,高版本firefox会获取不到文件。。
#6
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?
不用用uploadify这个插件,用jquery.form.js插件
uploadify问题比较多,高版本firefox会获取不到文件。。
好吧。。。。我去试试
#7
楼主 你的问题解决了吗?遇到和你一样的问题。。。。。
#8
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
#9
应该是请求超时的问题吧?
#10
应该是请求超时的问题吧?
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序
successTimeout 上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒
不过uploadify bug还是比较多。。还是iframe来模拟上传好点
#11
应该是请求超时的问题吧? 是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
有可能。。刚才看了下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;
}
$('#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
有没有大牛在啊
#3
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
#4
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?
#5
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?
不用用uploadify这个插件,用jquery.form.js插件
uploadify问题比较多,高版本firefox会获取不到文件。。
#6
用jquery.form.js替换,之前也碰到过,做的视频转换,视频没转完就执行uploasuccess回调了。。不懂什么问题。。
意思是将原来的jquery-2.0.3.min.js替换成jquery.form.js???其他地方用到jq的不会冲突吗?
不用用uploadify这个插件,用jquery.form.js插件
uploadify问题比较多,高版本firefox会获取不到文件。。
好吧。。。。我去试试
#7
楼主 你的问题解决了吗?遇到和你一样的问题。。。。。
#8
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
#9
应该是请求超时的问题吧?
#10
应该是请求超时的问题吧?
是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序
successTimeout 上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒
不过uploadify bug还是比较多。。还是iframe来模拟上传好点
#11
应该是请求超时的问题吧? 是最后换了插件吗?还是成功解决,这个问题 我也是纠结了一段时间的。
有可能。。刚才看了下api uploadify超时时间认:30秒。。想起来那个视频转换如果文件太大执行时间超过了30s就会默认执行完毕,实际后台还是在继续运行转换程序
successTimeout 上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒
不过uploadify bug还是比较多。。还是iframe来模拟上传好点
没想到最终就是successTimeout 解决的,之前没想过 会因为这个而不成功