`
huttoncs
  • 浏览: 199282 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

带有进度条的文件上传的小实例

阅读更多
1、文件上传的servlet在工程的web.xml文件中的配置
<servlet>
    <servlet-name>ProgressUploadServlet</servlet-name>
    <servlet-class>com.servlet.ProgressUploadServlet</servlet-class>
  </servlet>

<servlet-mapping>
    <servlet-name>ProgressUploadServlet</servlet-name>
    <url-pattern>/servlet/ProgressUploadServlet</url-pattern>
  </servlet-mapping>

2、文件上传的jsp文件内容如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
body,td,div {font-size: 12px;}
#progressBar {width: 400px;height: 12px;background: #FFFFFF;border: 1px
solid #000000;padding: 1px}
#progressBarItem {height: 100%;background: #FF0000;}
</style>

<script type="text/javascript">
var _finished = true; //是否上传结束标识符
function $(obj){
return document.getElementById(obj); //返回指定id的HTML元素
}

function showStatus(){
_finished = false; //显示进度条
$('status').style.display = 'block'; //将隐藏的进度条显示
$('progressBarItem').style.width='1%'; //设置进度条初始值为1%
$('btnSubmit').disabled = true; //把提交按钮置灰 防止重复提交

setTimeout("requestStatus()",1000); //1秒后执行requestStatus()方法,更新上传进度
}

function requestStatus(){ //向服务器请求上传进度信息
if(_finished)  return; //如果已经结束,则返回
var req = createRequest(); //获取Ajax请求
req.open("GET","servlet/ProgressUploadServlet"); //设置请求路径
req.onreadystatechange=function(){callback(req)} //请求完毕就执行callback(req)
req.send(null); //发送请求
setTimeout("requestStatus()",1000); //1秒后执行requestStatus()方法,更新上传进度
}

function createRequest(){ //返回Ajax请求对象
if(window.XMLHttpRequest){ //Netscape浏览器
return new XMLHttpRequest();
}else{ //IE浏览器
try{
return new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
return new ActiveXObject("Microsoft.XMLHTTP");
}

}
return null;
}

function callback(req){ //刷新进度条
if(req.readyState == 4){ //请求结束后
if(req.status != 200){ //如果发生错误,则显示错误信息
debug("发生错误。req.status: "+req.status + "");
return;
}
debug("status.jsp 返回值:"+ req.responseText); //显示debug信息
var ss = req.responseText.split("||"); //处理进度条信息。格式格式化:百分比||已完成数(M)||文件总长度(M)||传输速率(K)||已用时间(s)||
//估计总时间(s)||估计剩余时间(s)||正在上传第几个文件
$('progressBarItem').style.width='' + ss[0] + '%';
$('statusInfo').innerHTML = '已完成百分比: '+ ss[0]+'%<br/>已完成数(M):'+ss[1]+'<br/>文件总长度(M): '+ ss[2]+
'<br/>传输速率(K): '+ss[3]+'<br/>已用时间(s): '+ss[4]+'<br/>估计总时间(s): '+ss[5]+'<br/>估计剩余时间(s): '+
ss[6]+'<br/>正在上传第几个文件: '+ ss[7];

if(ss[1] == ss[2]){
_finished = true;
$('statusInfo').innerHTML += "<br/><br/><br/>上传成功。";
$('btnSubmit').disabled = false;
}
}
}

function debug(){
var div = document.createElement("DIV"); //显示提示信息
//div.innerHTML = "[debug]: "+ obj;
document.body.appendChild(div);
}
</script>
</head>
<body>
<iframe name=upload_iframe width=0 height=0></iframe>
<form action="servlet/ProgressUploadServlet" method="post" enctype="multipart/form-data"
target="upload_iframe" onsubmit="showStatus();">
<input type="file" name="file" style="width: 350px; "><br/>
<input type="submit" value="UPLOAD" name="btnSubmit" id="btnSubmit">
</form>
<br/><br/>
<div id="status" style="display:none;">
上传进度条:
<div id="progressBar">
<div id="progressBarItem"></div>
</div><br/><br/>
<div id="statusInfo"></div>
</div>


</body>
</html>


3、处理文件上传的servlet类的内容如下:
package com.servlet;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.beans.UploadStatus;
import com.listener.UploadListener;

public class ProgressUploadServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{

UploadStatus status = new UploadStatus(); //上传状态
UploadListener listener = new UploadListener(status); //监听器
request.getSession(true).setAttribute("uploadStatus", status); //把状态放到Session里

ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); //解析
upload.setProgressListener(listener); //设置上传listener

try {
List itemList = upload.parseRequest(request); //提交所有的参数
for (Iterator it=itemList.iterator();it.hasNext();) { //遍历所有的参数
FileItem item = (FileItem)it.next();

if (item.isFormField()) { //如果是表单数据
System.out.println("FormField: "+item.getFieldName()+" = "+item.getString());

}else { //否则就是上传文件
System.out.println("File: "+item.getName());
//统一Linux 与 windows 分路径分隔符
// String fileName = item.getName().replace("/", "\\");
// fileName = fileName.substring(fileName.lastIndexOf("\\"));
String fileName = item.getName();

File saved = new File("G:\\upload_test",fileName); //创建文件对象
saved.getParentFile().mkdirs(); //保证路径存在

InputStream ins = item.getInputStream(); //提交的文件内容
OutputStream ous = new FileOutputStream(saved); //输出流

byte[] tmp = new byte[1024]; //缓存
int len = -1; //缓存的实际长度
while ((len = ins.read(tmp))!=-1) {
ous.write(tmp,0,len); //写文件

}
ous.close();
ins.close();
response.getWriter().println("已保存文件: "+ saved);
}

}

} catch (FileUploadException e) {
response.getWriter().println("上传文件发生错误: "+ e.getMessage());
}

}

public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
response.setHeader("Cache-Control", "no-store"); //禁止浏览器缓存
response.setHeader("Pragrma", "no-cache"); //禁止浏览器缓存
response.setDateHeader("Expires", 0); //禁止浏览器缓存
response.setCharacterEncoding("UTF-8");

UploadStatus status = (UploadStatus) request.getSession(true)
.getAttribute("uploadStatus"); //从session中读取上传信息
if (status == null) {
response.getWriter().println("没有上传信息"); return; //没有上传信息,返回
}

long startTime = status.getStartTime(); //上传开始时间
long currentTime = System.currentTimeMillis(); //现在时间
long time = (currentTime - startTime) / 1000 + 1; //已传输的时间 单位: s

double velocity = ((double)status.getBytesRead()) / (double)time; //传输速度 单位: byte/s
double totalTime = status.getContentLength() / velocity; //估计总时间  单位: s
double timeLeft = totalTime - time; //估计剩余时间 单位: s
int percent = (int)(100 * (double)status.getBytesRead() / (double)
status.getContentLength()); //已完成的百分比
double length = ((double)status.getBytesRead())/1024/1024; //已完成数 单位: M
double totalLength = ((double)status.getContentLength())/1024/1024; //总长度 单位: M

//格式化:百分比||已完成数(M)||文件总长度(M)||传输速率(K)||已用时间(s)||
//估计总时间(s)||估计剩余时间(s)||正在上传第几个文件
String value = percent + "||"+ length+"||"+totalLength+"||"+velocity+"||"+ time +
"||"+totalTime +"||"+timeLeft+"||"+status.getItems();
response.getWriter().println(value); //输出给浏览器进度条
}

}


4、用于保存文件上传状态的实体类:
package com.beans;

public class UploadStatus {

private long bytesRead; //已上传的字节数,单位:字节
private long contentLength; //所有文件的总长度,单位:字节
private int  items; //正在上传的第几个文件
private long startTime = System.currentTimeMillis(); //开始上传时间,用于计算上传速率、估算上传时间等
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;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}


}


5、文件上传监听类
package com.listener;

import org.apache.commons.fileupload.ProgressListener;

import com.beans.UploadStatus;

public class UploadListener implements ProgressListener{

private UploadStatus status; //记录上传上传信息的Java Bean

public UploadListener(UploadStatus status){
this.status = status;
}

public void update(long bytesRead, long contentLength, int items) {
status.setBytesRead(bytesRead); //已读取的字节长度
status.setContentLength(contentLength); //文件总长度
status.setItems(items); //正在保存第几个文件

}


}
1
5
分享到:
评论

相关推荐

    带有进度条的文件上传示例

    asp.net 带有进度条的文件上传示例

    FTP上传实例(带进度条)

    带进度条的文件上传下载样例,其中带有封装好的ftp帮助类,可以将其复制出来应用到其他项目中。

    Vue实现带进度条的文件拖动上传功能

    主要介绍了Vue实现带进度条的文件拖动上传功能,本文通过实例代码给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

    springboot带有进度条的上传功能完整实例

    主要介绍了springboot带有进度条的上传功能,结合完整实例形式分析了springboot带进度条上传的原理、实现步骤与相关操作技巧,需要的朋友可以参考下

    最简单的swfupload上传实例,带中文文档,多文件上传,上传进度条

    下载了一些前辈门和官方的一些实例,都写得太复杂了,有用没用的都堆在一起,根本看不清楚原理,花了很大功夫总算弄明白了,把一些不必要的代码全部删除,尽量做到最简,希望对大家有帮助,不要像我开始接触白费了很...

    VB.net多线程大文件下载(带进度条和下载速度) 源码

    原创作品,因为自己一个项目需要用到大文件下载,在网上找了很久没有找到VB.NET下载大文件的实例,所以自己写了这个,采用多线程控制,带进度条和当前下载速度计算。 源码中包含有大量中文注释,也非常适合初学者...

    springMVC+ajax实现文件上传且带进度条实例

    本篇文章主要介绍了springMVC+ajax实现文件上传且带进度条实例,具有一定的参考价值,有兴趣的可以了解一下。

    PHP实现带进度条的Ajax文件上传功能示例

    本文实例讲述了PHP实现带进度条的Ajax文件上传功能。分享给大家供大家参考,具体如下: 之前分享了一篇关于 php使用FileApi实现Ajax上传文件 的文章,里面的Ajax文件上传是不带进度条的,今天分享一篇关于带进度条的...

    PHP+Ajax网站开发典型实例

    实例19 文件上传 实例20 网页计数器 实例21 超级链接计数 第3章 数据库、XML实例 实例22 mysql类库完成MySQL数据库的添加、删除和修改 实例23 mysqli类库完成MySQL数据库的添加、删除和查询 实例24 获取服务器...

    PHP+AjaxForm异步带进度条上传文件实例代码

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有; 一、首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量、一个对象或回调函数,这个对象主要有以下参数: var object= { url:url, //...

    aspupload文件上传组件的多种应用实例源码.rar

    aspupload文件上传组件的多种应用实例源码,一共有9个使用aspupload进行文件上传的例子,有简单调用的,有复杂调用的,显示进度条的等等,AspUpload.dll组件在Bin目录下,这是一些实例,如果要找一些原理方面的知识...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例074 带有滚动条的图形控件 2.9 滚动条控件典型实例 实例075 自定义滚动条控件 2.10 控件数组典型实例 实例076 向窗体中动态添加控件 实例077 公交线路模拟 第3章 图形技术 3.1 绘制图形 实例078 绘制...

    swfupload上传组件应用实例Demo

    以前一直使用ASP.NET自带的FileUpload控件进行上传文件,发现经常出问题. 尽管在web.config文件中设置了maxRequestLength为很大,但还是不能上传大于2M的文件. 所有后来研究了下上传相关知识, 发现swfupload是一个不错...

    Visual C++程序开发范例宝典(光盘) 第四部分

    实例074 带有滚动条的图形控件 2.9 滚动条控件典型实例 实例075 自定义滚动条控件 2.10 控件数组典型实例 实例076 向窗体中动态添加控件 实例077 公交线路模拟 第3章 图形技术 3.1 绘制图形 实例078 绘制...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    4.1 文件上传 285 实例223 以二进制形式上传文件到数据库 285 实例224 上传文件到服务器 287 实例225 限制上传文件的大小 288 实例226 限制上传文件的类型 291 实例227 上传多个文件到服务器 292 4.2 文件下载 294 ...

    Visual C++ 程序开发范例宝典 源码 光盘 part2

    cc实例071 利用RichEdit控件实现文字定位与标识 cc实例072 利用RichEdit控件显示图文数据 2.8 图形类控件典型实例 cc实例073 图文数据录入 cc实例074 带有滚动条的图形控件 2.9 滚动条控件典型实例 cc...

    Visual C++程序开发范例宝典(PDF扫描版).part3

     cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形...

    Visual C++程序开发范例宝典(PDF扫描版).part2

     cc实例074 带有滚动条的图形控件   2.9 滚动条控件典型实例   cc实例075 自定义滚动条控件   2.10 控件数组典型实例   cc实例076 向窗体中动态添加控件  cc 实例077 公交线路模拟  第3章 图形...

Global site tag (gtag.js) - Google Analytics