第一步:js部分代码
var fp = new Ext.FormPanel({
fileUpload : true,
width : 400,
frame : true,
title : '上传图片',
autoHeight : true,
bodyStyle : 'padding: 10px 10px 0 10px;',
labelWidth : 50,
url : 'uploadController?t=' + new Date(),
defaults : {
anchor : '95%',
allowBlank : false,
msgTarget : 'side'
},
items : [{
xtype : 'textfield',
fieldLabel : '名称',
name : 'name',
invalidText : '必须填写图片名称'
}, {
xtype : 'fileuploadfield',//此控件使用extjs的api中FileUploadField.js
id : 'form-file',
emptyText : '选择图片...',
invalidText : '必须选择图片',
fieldLabel : '地址',
name : 'url',
buttonCfg : {
text : '',
iconCls : 'upload'
}
}],
buttons : [{
text : 'Save',
handler : function() {
if (fp.getForm().isValid()) {
//显示进度条
Ext.MessageBox.show({
title : '正在上传文件',
width : 280,
progress : true,
icon : Ext.MessageBox.INFO,
cls : 'custom',//配置在css中图片
closable : false
});
fp.getForm().submit({
method : 'POST',
success : function(form, action) {
alert(action.result);
}
});
//设置一个定时器,每500毫秒向processController发送一次ajax请求
var timer = setInterval(function() {
//请求事例
Ext.Ajax.request({
//最好在ajax的请求的url上面都要带上日期戳,
//否则有可能每次出现的数据都是一样的,
//这和浏览器缓存有关
url : 'processController?t=' + new Date(),
method : 'get',
//处理ajax的返回数据
success : function(response, options) {
var obj = Ext.util.JSON
.decode(response.responseText);
if (obj.success != false) {
if (obj.finished) {
clearInterval(timer);
Ext.MessageBox.updateProgress(1,
obj.msg, 'finished');
Ext.MessageBox.hide();
} else {
var percentage = obj.percentage;
var process = percentage
.toString()
.substr(0, 6)
.replace(
/^(\d+\.\d{2})\d*$/,
"$1");
if (process > 1) {
return;
}
//1.var number = 123.4567
//number.toString().replace(/^(\d+\.\d{2})\d*$/,"$1") //结果:123.45
//2.var number = 123.4567
//number.toFixed(2); //结果:123.46 //IE 5.5以上
Ext.MessageBox.updateProgress(
percentage, process * 100
+ "%");
}
}
},
failure : function() {
clearInterval(timer);
Ext.Msg.alert('错误', '发生错误了。');
}
});
}, 500);
}
}
}, {
text : 'Reset',
handler : function() {
fp.getForm().reset();
}
}]
});
第二步:java类实现
package com.test.upload;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.myaction.FrmAction;//此frmaction是自封装类,此类实现了struts2.0的基本接口
import com.davidjc.ajaxfileupload.multipart.ProgressMonitor;
/**
* 主页图片面板控制action
*
*/
public class ImageAction extends FrmAction {
private File url;
private String fileName;
private String contentType;
public File getUrl() {
return url;
}
public void setUrl(File url) {
this.url = url;
}
public void setUrlFileName(String fileName) {
this.fileName = fileName;
}
public void setUrlContentType(String contentType) {
this.contentType = contentType;
}
/**
* 上传文件
* @param src
* @param dst
*/
private void copy(File src, File dst) {
try {
InputStream in = null ;
OutputStream out = null ;
try {
in = new BufferedInputStream( new FileInputStream(src) );
out = new BufferedOutputStream( new FileOutputStream(dst));
byte [] buffer = new byte [in.available()];
while (in.read(buffer) > 0 ) {
out.write(buffer);
}
} finally {
if ( null != in) {
in.close();
}
if ( null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 上传控制文件
* @return
*/
public String uploadController(){
try {
String imageName = System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
File uploadedFile = new File(request.getSession().getServletContext().getRealPath( "/images" ) + "/" + imageName);
copy(url, uploadedFile);
response.getWriter().write("{success:true,msg:'上传文件成功!'}");
response.getWriter().flush();
} catch (Exception e) {
e.printStackTrace();
}
return NONE;
}
/**
* 上传进程控制
* @return
* @throws Exception
*/
public String processController() throws Exception{
double d = 0.00;
//从session取出uploadPercentage并送回浏览器
Object mon_obj = this.sessionMap.get("com.davidjc.ajaxfileupload.multipart.ProgressMonitor");
if (mon_obj != null) {
ProgressMonitor monitor = (ProgressMonitor)mon_obj;
d = ((double)monitor.getBytesRead()/(double)monitor.getBytesLength());
}
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+d+"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
String msg = "";
if(d<1){
//d<0代表正在上传,
msg = "正在上传文件...";
response.getWriter().write("{success:true, msg: '"+msg+"', percentage:'" + d + "', finished: false}");
}
else if(d>=1){
//d>1 代表上传已经结束
msg = "上传成功!";
this.sessionMap.remove("com.davidjc.ajaxfileupload.multipart.ProgressMonitor");
response.getWriter().write("{success:true, msg: '"+msg+"', percentage:1, finished:true}");
//注意返回的数据,success代表状态
//percentage是百分比
//finished代表整个过程是否结束。
}
response.getWriter().flush();
return NONE;
}
}
第三步:在struts.xml加入如下配置
<!--实现机制:使用我们自己的解析器,主要机上 progressListener; -->
<bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="monitoredJakarta"
class="com.davidjc.ajaxfileupload.multipart.MonitoredMultiPartRequest" scope="default" optional="true" />
<constant name="struts.multipart.parser" value="monitoredJakarta"/>
<constant name="struts.multipart.maxSize" value="2000000000"/><!--解决不能上传大于2M文件问题-->
主要依赖jar文件:
commons-io-1.3.1.jar
commons-fileupload-1.2.jar
AjaxFileUpload-0.03.jar //此jar文件自定义实现上传机制。载入附件中。
注:此文章是本人把网上七零八碎的资料整理后的结果。