在Chrome上使用jQueryUI进度条和ajax时的奇怪行为
最近,我正在尝试使用ajax的jQueryUI进度条来构建文件上传进度条 它就像IE和firefox中的魅力一样,但Chrome中的行为非常怪异,这让我觉得我在编码部分做错了什么 我的设计是循环ajax函数来检索从servlet读取的上传字节,它在IE和firefox中工作 但是,在Chrome中运行时,ajax函数只能检索一次读取的上传字节,也就是第一次仅循环成功 在Chrome浏览器的左下角,upload percent计数器显示上载仍在运行,这使我认为问题与ajax调用有关 我试图从ajax打印错误消息,但结果没有错误消息 请在下面找到我的源代码: 阿贾克斯: ProgressListener:在Chrome上使用jQueryUI进度条和ajax时的奇怪行为,jquery,jquery-ui,jsp,google-chrome,progress-bar,Jquery,Jquery Ui,Jsp,Google Chrome,Progress Bar,最近,我正在尝试使用ajax的jQueryUI进度条来构建文件上传进度条 它就像IE和firefox中的魅力一样,但Chrome中的行为非常怪异,这让我觉得我在编码部分做错了什么 我的设计是循环ajax函数来检索从servlet读取的上传字节,它在IE和firefox中工作 但是,在Chrome中运行时,ajax函数只能检索一次读取的上传字节,也就是第一次仅循环成功 在Chrome浏览器的左下角,upload percent计数器显示上载仍在运行,这使我认为问题与ajax调用有关 我试图从aj
public class UploadProgressListener implements ProgressListener {
private HttpSession session;
private int percentDone = 0;
private long bytesRead;
private long contentLength;
private int items;
private static final Logger logger = Logger.getLogger(UploadProgressListener.class);
public UploadProgressListener(HttpSession session) {
this.session = session;
ProgressEntity entity = new ProgressEntity();
session.setAttribute("upload_file", entity);
}
public void update(long bytesRead, long contentLength, int items) {
ProgressEntity entity = (ProgressEntity) session.getAttribute("upload_file");
entity.setBytesRead(bytesRead);
entity.setContentLength(contentLength);
entity.setItems(items);
session.setAttribute("upload_file", entity);
this.bytesRead = bytesRead;
this.contentLength = contentLength;
this.items = items;
}
public long getBytesRead() {
return this.bytesRead;
}
}
多部分解析器:
public class ProgressUploadMultipartResolver extends CommonsMultipartResolver {
private HttpServletRequest request;
private static final Logger logger = Logger.getLogger(ProgressUploadMultipartResolver.class);
protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
upload.setSizeMax(-1);
if(request != null) {
HttpSession session = request.getSession();
UploadProgressListener uploadProgressListener = new UploadProgressListener(session);
upload.setProgressListener(uploadProgressListener);
}
return upload;
}
@Override
public MultipartHttpServletRequest resolveMultipart (HttpServletRequest request) throws MultipartException {
this.request = request;
return super.resolveMultipart(request);
}
@Override
public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
HttpSession session = request.getSession();
String encoding = "utf-8";
FileUpload fileUpload = prepareFileUpload(encoding);
UploadProgressListener uploadProgressListener = new UploadProgressListener(session);
fileUpload.setProgressListener(uploadProgressListener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch(FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
} catch (FileUploadException e) {
e.printStackTrace();
}
return null;
}
}
}
请让我知道,如果你需要我提供更多的源代码
多谢各位
更新:
请在上面找到进度条的Javascript函数
单击submit按钮时将调用fSubmit()函数
更新2:
还添加了其他java代码。因为没有人能给出合适的答案(也许我的问题太奇怪了??) 在这里,我想回答我自己的问题,我最终是如何完成的 因此,如果有人遇到类似的问题,他们将有一个可能的解决方案来尝试 答案很简单, 我在jsp中创建了一个iframe,并将表单的目标设置为该iframe 然后,Chrome中的进度条就像魅力一样工作 我对ajax和jQuery领域实在太陌生了,所以我不知道为什么一个iframe就可以解决这个困扰我一周的问题 虽然我必须处理另一个问题,因为终结点jsp现在显示在iframe中而不是父页面中,但至少进度条在所有常见浏览器中都正常工作,重定向问题是明天要解决的另一个谜
无论如何,希望任何遇到此问题的人都可以尝试此方法,祝您好运。循环的代码在哪里?
public class UploadProgressListener implements ProgressListener {
private HttpSession session;
private int percentDone = 0;
private long bytesRead;
private long contentLength;
private int items;
private static final Logger logger = Logger.getLogger(UploadProgressListener.class);
public UploadProgressListener(HttpSession session) {
this.session = session;
ProgressEntity entity = new ProgressEntity();
session.setAttribute("upload_file", entity);
}
public void update(long bytesRead, long contentLength, int items) {
ProgressEntity entity = (ProgressEntity) session.getAttribute("upload_file");
entity.setBytesRead(bytesRead);
entity.setContentLength(contentLength);
entity.setItems(items);
session.setAttribute("upload_file", entity);
this.bytesRead = bytesRead;
this.contentLength = contentLength;
this.items = items;
}
public long getBytesRead() {
return this.bytesRead;
}
}
public class ProgressUploadMultipartResolver extends CommonsMultipartResolver {
private HttpServletRequest request;
private static final Logger logger = Logger.getLogger(ProgressUploadMultipartResolver.class);
protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
upload.setSizeMax(-1);
if(request != null) {
HttpSession session = request.getSession();
UploadProgressListener uploadProgressListener = new UploadProgressListener(session);
upload.setProgressListener(uploadProgressListener);
}
return upload;
}
@Override
public MultipartHttpServletRequest resolveMultipart (HttpServletRequest request) throws MultipartException {
this.request = request;
return super.resolveMultipart(request);
}
@Override
public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
HttpSession session = request.getSession();
String encoding = "utf-8";
FileUpload fileUpload = prepareFileUpload(encoding);
UploadProgressListener uploadProgressListener = new UploadProgressListener(session);
fileUpload.setProgressListener(uploadProgressListener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch(FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
} catch (FileUploadException e) {
e.printStackTrace();
}
return null;
}
}
public class ProgressEntity {
private long bytesRead = 0L;
private long contentLength = 0L;
private int items;
public long getBytesRead() {
return bytesRead;
}
public void setBytesRead(long bytesRead) {
this.bytesRead = bytesRead;
}
public long getContentLength() {
return contentLength;
}
public void setContentLength(long contentLength) {
this.contentLength = contentLength;
}
public int getItems() {
return items;
}
public void setItems(int items) {
this.items = items;
}