`
hypercube1024
  • 浏览: 85471 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用flex4制作带进度条的多文件上传

    博客分类:
  • java
阅读更多
普通的html表单提交无法一次选择多文件上传,并且显示上传进度条比较麻烦。所以用flex做了一个多文件上传控件和大家分享
FileUpload.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" fontSize="12" creationComplete="init()">
	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>  
		<![CDATA[ 
			import flash.events.*;
			
			import mx.collections.ArrayList;
			import mx.core.FlexGlobals;
			
			private var files : FileReferenceList;
			[Bindable]
			private var fileArray : ArrayList;
			
			private var serverUrl : String;
			private var userId : String;
			private var allowTypes : XML;
			
			private function init() : void {
				Security.allowDomain("*");
				var params : Object = FlexGlobals.topLevelApplication.parameters;

				serverUrl = encodeURI(parameters.serverUrl);
				userId = params.userId;
				allowTypes = new XML( encodeURI(params.allowTypes) );
				trace(userId);
				trace(serverUrl);
				trace(allowTypes.children());
				
				files=new FileReferenceList();
				files.addEventListener(Event.SELECT, onSelect);
				
			}
			
			private function upload() : void {
				var types : Array = new Array();
				var typeXml : XMLList = allowTypes.children();
				
				for(var i : int = 0; i < typeXml.length(); i++ ) {
					types.push( new FileFilter( typeXml[i].@name, typeXml[i].@pattern ) );
				}
				
				files.browse(types);
			}    
			
			private function onSelect(e:Event) : void {
				var request:URLRequest=new URLRequest(serverUrl);
				
				fileArray = new ArrayList(files.fileList);
				ExternalInterface.call("onFileSelect", fileArray.length);
				for(var i:int = 0; i < fileArray.length; i++) {
					var file:FileReference = fileArray.source[i] as FileReference;
					file.upload(request);
				}
			}
			
		]]>  
	</fx:Script>  
	
	<s:VGroup>
		<s:Button label="上传文件" click="upload();" />
		<s:List dataProvider="{fileArray}" itemRenderer="FileItem" borderVisible="false"/>
	</s:VGroup>
</s:Application>



FileItem.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
		   xmlns:s="library://ns.adobe.com/flex/spark" 
		   xmlns:mx="library://ns.adobe.com/flex/mx" >

	<fx:Declarations>
		<!-- 将非可视元素(例如服务、值对象)放在此处 -->
	</fx:Declarations>
	<fx:Script>
		<![CDATA[
			private var _data:Object;
			
			override public function set data( obj : Object ) : void { 
				this._data = obj; 
				var file : FileReference = (this._data as FileReference);
				file.addEventListener(ProgressEvent.PROGRESS, onProgress); 
				file.addEventListener(Event.COMPLETE, onComplete);
				fileName.text = file.name;
			}
			
			override public function get data() : Object { 
				return this._data; 
			}
			
			private function onProgress(e:ProgressEvent) : void {
				cancelBtn.visible = true;
				
				var loaded : uint = e.bytesLoaded / 1024;
				var total : uint =  e.bytesTotal / 1024;  
				var proc:uint = e.bytesLoaded / e.bytesTotal * 100;    
				bar.setProgress(proc, 100);
				bar.label = proc + "%";
				labelProgress.text = loaded + "kb / " + total + "kb";
			}
			
			private function onComplete(e:Event) : void {
				cancelBtn.visible = false;
				ExternalInterface.call("onUploadComplete");
			}
			
			private function cancelUpload(e:Event) : void {
				var file : FileReference = (this._data as FileReference);
				file.cancel();
			}
		]]>
	</fx:Script>
	<s:states>
		<s:State name="normal"/>
		<s:State name="hovered"/>
		<s:State name="selected" />
	</s:states>
	
	<s:layout>
		<s:VerticalLayout/>
	</s:layout>
	
	<s:HGroup verticalAlign="middle" paddingTop="5" paddingBottom="5">
		<s:Label id="fileName"/>
		<mx:ProgressBar id="bar"    
						labelPlacement="center"    
						minimum="0"    
						visible="true"    
						maximum="100"    
						label="0%"    
						direction="right"    
						mode="manual"    
						width="200"/>
		<s:Label id="labelProgress" />
		<s:Button id="cancelBtn" label="取消" click="cancelUpload(event)" visible="false" />
	</s:HGroup>
	
</s:ItemRenderer>



jsp引入部分
<script type="text/javascript" src="<c:url value="/assets/js/lib/upload/swfobject.js"/>"></script>
<div style="height: 200px; width: 500px;">
		<div id="flashContent">
	       	<p>
	        	To view this page ensure that Adobe Flash Player version 
				10.0.0 or greater is installed. 
			</p>
			<script type="text/javascript"> 
				var pageHost = ((document.location.protocol == "https:") ? "https://" :	"http://"); 
				document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
								+ pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
			</script> 
	    </div>
	</div>
<script type="text/javascript">
<!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 
var swfVersionStr = "10.0.0";
<!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
var xiSwfUrlStr = "${contextPath}/assets/js/lib/upload/playerProductInstall.swf";
var flashvars = {};

flashvars.serverUrl = "${contextPath}/app/sys/file/upload;jsessionid=" + "<%= request.getSession().getId() %>";
flashvars.allowTypes =
'<?xml version="1.0" encoding="UTF-8"?>'
+ '<allowTypes>'
	+ '<type name="图像" pattern="*.jpg;*.jpeg;*.png;*.gif" />'
	+ '<type name="文档" pattern="*.pdf;*.doc;*.txt" />'
	+ '<type name="视频" pattern="*.avi;*.flv;*.rmvb" />'
	+ '<type name="全部" pattern="*" />'
+ '</allowTypes>';

var params = {};
params.quality = "high";
params.bgcolor = "#ffffff";
params.allowscriptaccess = "sameDomain";
params.allowfullscreen = "true";
var attributes = {};
attributes.id = "FileUpload";
attributes.name = "FileUpload";
attributes.align = "middle";
swfobject.embedSWF(
    "${contextPath}/assets/js/lib/upload/FileUpload.swf", "flashContent", 
    "100%", "100%", 
    swfVersionStr, xiSwfUrlStr, 
    flashvars, params, attributes);
<!-- JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. -->
swfobject.createCSS("#flashContent", "display:block;text-align:left;");

var fileNum;
function onFileSelect(num) {
	fileNum = num;
}

function onUploadComplete() {
	fileNum--;
	if(fileNum < 0) {
		showMsg("addRet", "文件上传成功!");
		$grid.reload();
	}
}
</script>


服务端接受文件代码
@RequestMapping(value = "/file/upload", method = RequestMethod.POST)
	public @ResponseBody
	String upload(HttpServletRequest request) {
		User user = (User) request.getSession().getAttribute(
				AuthenticationService.CURRENT_USER);
		Set<MultipartFile> mfs = getFileSet(request);

		for (MultipartFile mf : mfs) {
			String originalFilename = mf.getOriginalFilename();
			String name = originalFilename.substring(0,
					originalFilename.lastIndexOf(".")).toLowerCase();
			String extName = originalFilename.substring(
					originalFilename.lastIndexOf(".")).toLowerCase();

			GenericFile file = new GenericFile();
			file.setName(name);
			file.setExtName(extName);
			try {
				file.setFile(mf.getBytes());
			} catch (IOException e) {
				e.printStackTrace();
			}
			file.setUserId(user.getId());
			file = fileService.save(file);
			log.info("save file {}", file.getId());
		}

		int mfsSize = mfs.size();
		log.info("file size {}", mfsSize);

		return mfsSize > 0 ? "true" : "false";
	}

private Set<MultipartFile> getFileSet(HttpServletRequest request) {
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		Set<MultipartFile> fileset = new LinkedHashSet<MultipartFile>();
		for (Iterator<String> it = multipartRequest.getFileNames(); it
				.hasNext();) {
			String key = it.next();
			MultipartFile file = multipartRequest.getFile(key);
			if (file.getOriginalFilename().length() > 0) {
				log.info("file name [{}]", file.getOriginalFilename());
				fileset.add(file);
			}
		}
		return fileset;
	}
分享到:
评论

相关推荐

    Flex 指定文件下载 带进度条

    在Flex编程中,指定文件下载并带有进度条功能是一项常见的需求,这主要涉及到网络I/O操作、事件处理以及用户界面的更新。以下是对这个主题的详细讲解。 首先,Flex是Adobe开发的一种开源富互联网应用程序(RIA)...

    Flex 4 进度条的皮肤

    本文将深入探讨如何在Flex 4中创建和定制进度条的皮肤。 首先,我们需要了解Flex 4中的皮肤架构。Flex 4引入了Spark组件模型,其中皮肤是组件外观的独立层,可以通过CSS样式或MXML代码进行定义。每个组件都有一个...

    flex带进度条上传文件

    flex带进度条上传文件,非常棒,相信你会喜欢的。大家不要下载了,这个资源不知道为什么不能用了,请csdn的管理员关注一下。

    Flex进度条小例子

    标题中的“Flex进度条小例子”表明我们将讨论的是使用Adobe Flex技术实现的进度条组件的应用。Flex是一个开源的、基于MXML和ActionScript的框架,用于构建富互联网应用程序(RIA)。在Flex中,我们可以创建自定义的...

    Flex 进度条

    Flex进度条是一种用于显示操作进度的图形用户界面组件,尤其适用于那些需要花费一定时间的异步操作,比如文件下载、音乐或视频的加载以及登录过程等。通过进度条,用户可以直观地看到当前操作的完成情况,从而减少...

    结合flash制作的flex进度条

    4. **在Flex项目中引入SWC**:将SWC文件放入Flex项目的库目录,然后在Flex的.mxml文件中通过`&lt;mx:Component&gt;`标签引入并实例化自定义进度条。 5. **使用和控制进度条**:在Flex代码中,可以通过设置`...

    flex进度条

    除了上述基本功能外,Flex进度条还可以进行更多定制化操作,例如改变样式、添加动画效果等。这些都可以通过调整 `ProgressBar` 的属性来实现。例如,可以通过修改 `chromeColor`、`color` 等属性来自定义进度条的...

    Flex 多文件上传组件

    Flex多文件上传组件是一种在Adobe Flex环境中实现的高级功能,允许用户一次性选择并上传多个文件。这个组件在Web应用程序中非常实用,特别是在处理大量图片、文档或其他类型文件上传的场景下,大大提升了用户体验。 ...

    flex 自定义进度条

    标题提到的"flex 自定义进度条",指的是利用Flex布局技术来设计一个可定制的进度条组件。Flex布局,全称为Flexible Box布局,是一种在CSS3中引入的布局模型,旨在提供更灵活的盒状模型布局方式,尤其适合在不同屏幕...

    flex实现多文件上传

    在Flex中实现多文件上传,通常涉及到ActionScript编程、组件使用以及与服务器端的交互。下面将详细介绍如何使用Flex来实现这个功能。 一、Flex中的文件选择组件 在Flex中,我们可以使用`FileReference`类来处理文件...

    flex4 remoteobject 多文件上传的例子

    在这个"flex4 remoteobject 多文件上传的例子"中,我们将重点探讨如何使用RemoteObject组件来实现多文件的上传,并且在上传过程中显示进度信息。 首先,我们要理解RemoteObject的工作原理。RemoteObject通过HTTP、...

    flex文件上传下载,在线以pdf形式浏览文件

    综上所述,实现"flex文件上传下载,在线以pdf形式浏览文件"这一功能,需要综合运用前端开发、后端接口设计、文件处理和安全策略等多个领域的知识,为用户提供便捷、安全的文件管理体验。在实际开发过程中,还需要...

    Flex+php 批量上传源码 (可刷新进度条 )

    在Flex中,我们通常会使用`FileReference`类来处理文件上传。`FileReference`允许用户选择本地文件,并提供了`upload()`方法用于将文件发送到服务器。为了实现批量上传,我们需要创建一个数组或集合来存储多个`...

    Flex多文件上传+md5验证文件是否上传

    标题“Flex多文件上传+md5验证文件是否上传”揭示了该技术的核心要点:使用Flex来处理多个文件的上传,并通过MD5哈希校验确保上传的文件与原始文件一致,防止数据篡改。 1. **多文件上传**:在Flex中,可以利用...

    Flex 上传文件控件 (带java服务端)

    本项目提供了一个完整的Flex文件上传控件,且集成了Java服务端处理,允许用户上传文件到服务器,并能进行多文件或单文件选择,以及设置上传文件大小限制,同时展示上传进度条,为用户提供友好的交互体验。...

    flex 多文件上传

    "flex 多文件上传"是指使用Adobe Flex框架实现的能够同时上传多个文件的功能。Flex是一款强大的RIA(富互联网应用)开发工具,它基于ActionScript编程语言和Flash Player运行时环境,提供丰富的用户界面组件和交互...

    flex+java文件上传

    综上所述,"flex+java文件上传"涉及到前端的Flex界面设计与交互、Flash Player运行环境、后端的Java处理逻辑以及文件上传的安全性和性能优化等多个知识点。在实际应用中,开发者需要结合这些技术来实现稳定、安全且...

    Flex multiple file uploader (Flex多文件上传范例)

    为了实现多文件上传,Flex客户端需要使用循环或数组来处理多个FileReference对象。每个FileReference对象都绑定一个上传事件监听器,当用户选择并提交文件时,这些监听器会被触发,依次执行上传操作。在PHP端,也...

    使用FLEX进行多文件上传和自定义上传信息.zip_flex_文件上传

    本教程将探讨如何使用Adobe Flex这一强大的富互联网应用程序(RIA)框架来实现多文件上传及自定义上传信息的功能。 Flex是一种基于ActionScript 3.0的开放源代码编程语言,它允许开发者创建具有丰富用户界面的Web...

    Flex4 文件上传

    在Flex4中,文件上传功能是通过一个名为FileReference的类来实现的,它是Flash Player API的一部分。 在“Flex4 文件上传”项目中,开发者利用Flex4的特性,结合PHP后端技术,创建了一个文件上传功能。PHP是一种...

Global site tag (gtag.js) - Google Analytics