URL:http://blog.csdn.net/xuweilinjijis/article/details/8876305

之前在网上找过很多相关资料,很多所谓的批量上传都是忽悠人的,真正的批量上传指的是 用户一次性可以选择多个文件,然后上传是将所有选取的文件上传到服务器。java中真正可以实现批量上传的技术大致有两种:一种是通过flash;一种是 通过applet;不过html5也可以支持批量拖选。两种方式有各自的优缺点,其中flash对于浏览器兼容性较好,基本可以满足市面上大众浏览器,缺 点就是对于上传文件大小有限制,如果用户只需要上传一些图片或者文档文件的话,这种选择还是比较理想的;applet方式可以上传大文件,但是需要浏览器 支持jdk并安装相关插件。

今天这个项目采用的是flash方式。整体设计思路:采用ext+swfupload进行上传界面显示,后台采用strust2来处理上传文件。

最终项目运行效果图如下:

前台jsp文件源码index.jsp:

<%@ page contentType="text/html;charset=gb2312" language="java"%>
<html>
<head>
<title>swf 上传</title>
<link rel="stylesheet" type="text/css"
href="js/css/ext-all.css" /> </head> <body>
<script type="text/javascript" src="js/ext-base.js"></script>
<script type="text/javascript" src="js/ext-all.js"></script>
<script src="swf/swfupload.js" type="text/javascript"></script>
<script src="swf/swfupload.speed.js" type="text/javascript"></script>
<script src="swf/mode.js" type="text/javascript"></script>
<script src="swf/handlers.js" type="text/javascript"></script>
<script type="text/javascript" src="js/prototype/prototype.js"></script>
<script type="text/javascript" src="js/bramus/jsProgressBarHandler.js"></script>
<script type="text/javascript">
// 允许上传文件的全部大小
var limtallsize=50000000; function UploadGrid()
{
var mine=this;
var states=[{v:-1,t:'等待'},{v:0,t:'就绪'},{v:1,t:'上传中'},{v:2,t:'停止'},{v:3,t:'成功'},{v:4,t:'失败'}];
function statesRender(v)
{
for(var i=0;i<states.length ;i++)
{
if(states[i].v==v)
{
return states[i].t;
}
}
}
function rateRender(value, metaData, record, rowIndex, cellIndex, store)
{
v=value?value:0;
//return "<table border='0' cellpadding='0' cellspacing='0' width='100%' height='100%'><tr><td bgcolor='#0000FF' height='100%' align='center' width='"+v+"%'><font color='white'>"+v+"%</font></td><td></td></tr></table>";
//setProgress(v);
return "<span id=\"element6_"+record.data.id+"\" rate=\""+v+"\"></span>";
} var rn=new Ext.grid.RowNumberer();
var sm = new Ext.grid.CheckboxSelectionModel({singleSelect:false});
var cm = new Ext.grid.ColumnModel([
rn,
sm,
{header:'文件名称',dataIndex:'fileName',menuDisabled:true,width: 100},
{header:'大小' ,dataIndex:'fileSize',menuDisabled:true,width: 100},
{header:'进度' ,dataIndex:'rate',menuDisabled:true,width: 180,renderer:rateRender},
{header:'速度' ,dataIndex:'speed',menuDisabled:true},
{header:'状态' ,dataIndex:'state',menuDisabled:true,renderer:statesRender}
]); this.ds = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url:'test!query.action',method:'post'}),
remoteSort:false,
reader: new Ext.data.JsonReader(
{totalProperty:'records',root:'root'},
[
{name: 'id'},
{name: 'fileName'},
{name: 'code'},
{name: 'fileSize'},
{name: 'rate'},
{name: 'speed'},
{name: 'state'}
]) }); var RC=Ext.data.Record.create([
{name: 'id', mapping: 'id'},
{name: 'code', mapping: 'code'},
{name: 'fileName', mapping: 'fileName'},
{name: 'fileSize', mapping: 'fileSize'},
{name: 'rate', mapping: 'rate'},
{name: 'speed', mapping: 'speed'}
]); this.grid = new Ext.grid.GridPanel({ ds: mine.ds,
cm: cm,
sm: sm,
anchor:'100%',
loadMask:{msg:'数据加载中...'},
viewConfig:{forceFit:true},
height:300,
width :600,
tbar:[{id:'spanSWFUploadButton',text:'-'},'-'],
listeners:{
render:function()
{
// ytb-sep
var cmp=Ext.getCmp("spanSWFUploadButton");
var pcont=cmp.getEl().parent();
pcont.update("<span id='spanSWFUploadButton' class='blank'></span>");
var swfu = new SWFUpload({
upload_url : "upload.action",
post_params : {
"god" : "god","uid" : "u"
}, flash_url : "swf/swfupload.swf",
button_placeholder_id : "spanSWFUploadButton",
button_image_url : "swf/bt.png",
button_text_right_padding : 100,
button_width: 61,
button_height : 22, button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES,
// handler here
swfupload_loaded_handler : Handlers.swfUploadLoaded,
file_queued_handler : Handlers.fileQueued,
file_queue_error_handler : Handlers.fileQueueError,
upload_progress_handler : Handlers.uploadProgress,
upload_error_handler : Handlers.uploadError,
upload_success_handler : Handlers.uploadSuccess
});
swfu.grid=mine.grid;
swfu.ds=mine.ds;
swfu.RC=RC;
}
}
}); } Ext.onReady(function(){
Ext.QuickTips.init();
Ext.form.Field.prototype.msgTarget = 'side';
Ext.BLANK_IMAGE_URL ='../../images/s.gif';
var grid=new UploadGrid();
var win = new Ext.Window({
title:'上传表格测试',
el:'panel',
width:620,
height:350,
closeAction:'hide',//关闭窗口时渐渐缩小
plain: true, items:[grid.grid], buttons: [{
text:'Submit',
disabled:true
},{
text: 'Close',
handler: function(){
win.hide();
}
}]
});
win.show(this);
})
</script>
<div id="panel"></div>
</body>
</html>

后台UploadAction.java:

    package upload.action;  

    import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.struts2.ServletActionContext; public class UploadAction
{
private File Filedata; private String FiledataFileName; private String FiledataContentType; // 文件夹目录
private static final String basePath = "fileupload\\groupResource"; public String execute()
{ String s = (String)ServletActionContext.getRequest().getParameter("god");
String s2 = (String)ServletActionContext.getRequest().getParameter("uid");
if (Filedata != null && Filedata.length() > 0)
{
// 群组名字作为最后的文件夹
String groupFileName = "haoba"; String uploadPath = ServletActionContext.getServletContext()
.getRealPath(basePath+"\\"+groupFileName);
File path = new File(uploadPath); if (!path.exists())
{
path.mkdirs();
}else{
//文件已存在
//FiledataFileName
} String newPath = uploadPath +"\\"+FiledataFileName;
Filedata.renameTo(new File(newPath)); // 保存到数据库中的路径
String savePath = basePath+"\\"+groupFileName+"\\"+FiledataFileName; } return null;
} // 上传文件
private String pathSplit(String timeStr, String o, String n)
{
StringBuffer sb = new StringBuffer();
for (String a : timeStr.split(o))
{
sb.append(a);
sb.append(n);
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
} public static String format(Date date, String parttern)
{
DateFormat df = new SimpleDateFormat(parttern);
return df.format(date);
} public File getFiledata()
{
return Filedata;
} public void setFiledata(File filedata)
{
Filedata = filedata;
} public String getFiledataFileName()
{
return FiledataFileName;
} public void setFiledataFileName(String filedataFileName)
{
FiledataFileName = filedataFileName;
} public String getFiledataContentType()
{
return FiledataContentType;
} public void setFiledataContentType(String filedataContentType)
{
FiledataContentType = filedataContentType;
} public static void main(String[] args) {
System.out.println(0.444<1);
}
}

源码免费下载地址:http://dl.vmall.com/c0lmx5394j

swfupload控件使用指南:http://dl.vmall.com/c0s0bbqp5i

[Pulgin] 利用swfupload实现java文件批量上传的更多相关文章

  1. SWFUpload无刷新文件批量上传

    一.首先将SWFUpload所有文件加入项目中,如图

  2. jquery文件批量上传控件Uploadify3.2(java springMVC)

    人比較懒  有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/  -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...

  3. b/s利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  4. 前端利用webuploader实现超大文件分片上传、断点续传

    本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...

  5. 文件批量上传的工具,要实现暂停继续、断点续传等功能(使用QtNetwork和QHttpMultiPart,和定时器检查超时)

    最近在做一个文件批量上传的工具,要实现暂停继续.断点续传等功能.利用Qt自带的QtNetwork模块,完成这些需求并没有费多少周章,主要思路就是将文件分块,然后用while循环依次传输.具体实现代码比 ...

  6. 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0

    实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...

  7. 使用WebUploader实现文件批量上传,进度条显示功能

    知识点:利用WebUploader,实现文件批量上传,并且实时显示文件的上传进度 参考官方文档:http://fex.baidu.com/webuploader/ (1)引入三个资源 JS,CSS,S ...

  8. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  9. 带进度条的文件批量上传插件uploadify

    有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另 ...

随机推荐

  1. Md2All,让公众号完美显示Latex数学公式

    当公众号遇上Latex 大家都知到,公众号连代码块都不支持,更不要说功能强大的Latex公式了.那在Md2All之前,如果想在公众号上显示Latex公式应该怎么办呢? 最通常的做法就是在某个支持Lat ...

  2. Android ViewPager使用方法小结

    android-support-v4.jar 是谷歌提供给我们的一个兼容低版本安卓设备的软件包,里面包囊了只有在 Android 3.0 以上可用的API.而 ViewPager 就是其中之一.利用它 ...

  3. Linux通信之poll机制分析

    poll机制分析 韦东山 2009.12.10 所有的系统调用,基于都可以在它的名字前加上“sys_”前缀,这就是它在内核中对应的函数.比如系统调用open.read.write.poll,与之对应的 ...

  4. (转载) ORA-12537:TNS连接已关闭

    今天在远程客户端配置EBS数据库连接的时候发生“ORA-12537:TNS连接已关闭”的错误.进入服务器运行如下命令:$tnsping VIS 这里VIS如果定义服务名,可以写成 $ tnsping ...

  5. 用SQL Server验证用户名和密码

    用SQL Server验证用户名和密码,从页面输入的用户名和密码与数据库的用户名和密码进行匹配,正确则登入,错误则提醒. <form action="index.jsp" m ...

  6. 《Linux程序设计》笔记(二)shell程序设计

    1. 进程树形显示 ps -e f 2. 重定向 > 覆盖文件 >> 附加至文件 1> 标准输出 2> 标准错误输出 0 代表一个程序的标准输入 3. 程序可以在当前目录 ...

  7. 用VS Code Debug Python

  8. 初识 Django

    HTTP协议 HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通信规则规定 ...

  9. Codeforces Round #550 (Div. 3)E. Median String

    把字符串看作是26进制的数,从后往前翻译,那么就可以把两个串变成对应的26进制的数字,那么只要把两个数加起来除以二就得到中间的串对应的数了,同理再转化回来就行了.但是这样会有一个问题就是串的长度有2e ...

  10. 关于js开发中保留小数位计算函数(以向上取整或向下取整的方式保留小数)

    前端工作中经常遇到数字计算保留小数问题,由于不是四舍五入的方式不能使用toFixed函数,本文采用正则表达式匹配字符串的方式,解决对数字的向上或向下保留小数问题: 1.向上保留小数(只要目标小数位后有 ...