日期:2014-05-17  浏览次数:20776 次

各位大虾请教啊
我最近做了一个上传文件的页面,使用的是jsp和serlvet技术,最近要添加一个上传文件的时候要个进度表,请问这个进度表怎么做啊?

------解决方案--------------------
楼下一定会说用jquery进度条,但是用过后的确不错
------解决方案--------------------
用ajax轮询获取上传数据情况信息
------解决方案--------------------
服务器端用的apache的那个上传lib吗?那个里面有一个事件,可以在每次读byte的时候触发。用session将percent记录下来。然后客户端用ajax每次去读session里的那个percent。至于客户端用什么进度条随便啦。
------解决方案--------------------
你想自己写,给你一段代码:
/**
 * 上传文件的监听器
 * @author xjl
 * @version 2.0
 */
public class UploadListener implements ProgressListener {

private UploadInfo info;

/**
 * 构造方法
 * @param session
 */
public UploadListener(HttpSession session) {
info = (UploadInfo) session.getAttribute(FrameConfig.uploadInfo);
if (null == info) {
info = new UploadInfo();
}
session.setAttribute(FrameConfig.uploadInfo, info);
}

/**
 * 上传文件即时监听
 * @param readSize 已上传字节数
 * @param fileSize 文件总大小
 * @param num 目前正在读取第几个文件
 */
public void update(long readSize, long fileSize, int num) {
if (num > 0) {
Double percent = ( ((Long) readSize).doubleValue() / ((Long) fileSize).doubleValue()) * 100d;
info.setFileSize(fileSize);
info.setNum(num);
info.setPercent(percent.intValue());
info.setReadSize(readSize);
}
}

}

/**
 * 上传文件, 返回上传成功的文件个数, 可以读取文件上传的实时进度
 * @param folder 文件存放的目录,物理路径
 * @param newFileName 保存为新文件的名称(支持多个文件同时上传)
 * @return int 
 */
@SuppressWarnings("unchecked")
public int uploadFile(String folder, String []newFileName) {
int num = -1;
try {
File folderFile = new File(folder);
FileUtil.getBean().createFolder(folder);
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(FrameConfig.maxUploadFileSize);
upload.setProgressListener(new UploadListener(getSession()));
getRequest().setCharacterEncoding("UTF-8");
Iterator iterator = upload.parseRequest(getRequest()).iterator();
while (iterator.hasNext()) {
FileItem item = (FileItem) iterator.next();//源文件
if (!item.isFormField() && !"".equals(item.getName())) {
num++;
if (num < newFileName.length) {
OutputStream output = new FileOutputStream(new File(folderFile, newFileName[num]));
InputStream input = item.getInputStream();
try {
byte[] buffer = new byte[1024];
int i = 0;
while ((i = input.read(buffer)) != -1) {
output.write(buffer, 0, i);//保存文件
}
} catch (Exception e) {
e.printStackTrace();
} finally {