jsp 和servlet 的一个问题

didiaogao 2011-08-19 02:45:01
我在做一个文件上传的功能。
当点击上传后,需要时时的返回文件上传的进度。在页面上显示进度条。

我现在是在js里面用ajax 调用servlet。然后用servlet调用文件上传的处理类。。这个文件上传的进度在这个类里面。我怎么能时时的返回到页面啊?

js

http_request = false;
//下面需要建立一个XMLHttpRequest对象,用它进行服务器请求,针对不同浏览器建立方法不同
if (window.XMLHttpRequest)
{ // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType)
{
http_request.overrideMimeType('text/xml');
}
}
else if (window.ActiveXObject)
{ // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}

if (!http_request) {
alert('出现错误,不能建立一个XMLHTTP实例!');
return false;
}
//var url = "servlet/UploadServlet?filepath="+filepath;
var url = "servlet/UploadServlet?filepath="+"F://ScreenKinescope.rar";

//funccallback为请求返回后要调用的javascript方法
http_request.onreadystatechange = funccallback;
//该请求用get方式发送至url为/servlet/CheckServlet的Servlet,url可以带参数或数据方式同一般url传值,Servlet请看后面代码
//http_request.open('GET',url, true);
//http_request.send(null);
//如果要使用HTTP POST方式,必须要对 XMLHttpRequest 对象设置一个 Content-Type 头,使用以下语句(url中也可包含参数):
http_request.open('POST',url, true);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http_request.send(null);
//每隔5秒循环一次服务器请求
setTimeout('startProgress()',1000);


servlet:

String filepath = request.getParameter("filepath");
String filepathF ="";
if (filepath.contains("/")) {
filepathF = filepath.substring(filepath.lastIndexOf("/") + 1);
}
ContinueFtp c = new ContinueFtp();
c.connect("localhost", 21, "userid", "gao");
c.u(filepath, "/"+filepathF);

文件上传的具体类:

public UploadStatus uploadFile(String remoteFile, File localFile,
FTPClient ftpClient, long remoteSize) throws IOException {
UploadStatus status;
// 显示进度的上传
long step = localFile.length() / 100;
long process = 0;
long localreadbytes = 0L;
//InputStream raf = new FileInputStream(localFile);
RandomAccessFile raf = new RandomAccessFile(localFile, "r");
OutputStream out = ftpClient.appendFileStream(new String(remoteFile
.getBytes("GBK"), "iso-8859-1"));
// 断点续传
if (remoteSize > 0) {
ftpClient.setRestartOffset(remoteSize);
process = remoteSize / step;
raf.seek(remoteSize);
localreadbytes = remoteSize;
}
byte[] bytes = new byte[1024];
int c;
while ((c = raf.read(bytes)) != -1) {
out.write(bytes, 0, c);
localreadbytes += c;
if (localreadbytes / step != process) {
process = localreadbytes / step;
UploadServlet.a = process;
System.out.println("上传进度:" + process);
// TODO 怎么把这个process这个变量时时的传到jsp页面上啊
}
}
out.flush();
raf.close();
out.close();
boolean result = ftpClient.completePendingCommand();
if (remoteSize > 0) {
status = result ? UploadStatus.Upload_From_Break_Success
: UploadStatus.Upload_From_Break_Failed;
} else {
status = result ? UploadStatus.Upload_New_File_Success
: UploadStatus.Upload_New_File_Failed;
}
return status;
}
...全文
77 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
桃园闲人 2011-08-19
  • 打赏
  • 举报
回复
你在servlet中不断的out进度信息给页面,当全部都上传完了,你在关闭out流。这样试试看,我也没做过这个,不知道可行否。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧