加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex4/Flash多文件上传(带进度条)实例分享

发布时间:2020-12-15 03:50:47 所属栏目:百科 来源:网络整理
导读:要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识。 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演示地址资料下载 ? FLASH文件上传和传统的HTML文件上传,能实现多文件上传、大文件上传,和上传前预览。 当然HT

要求

  • 必备知识

    本文要求基本了解 Adobe Flex编程知识和JAVA基础知识。

  • 开发环境

    MyEclipse10/Flash Builder4.6/Flash Player11及以上

  • 演示地址

    演示地址资料下载

?



FLASH文件上传和传统的HTML文件上传,能实现多文件上传、大文件上传,和上传前预览。
当然HTML5也能实现上述功能,这里就不多说了,有时间我在做一个实例和大家分享一下。
?
?

下面介绍一下?百度图片?基于FLASH文件上传工具截图:

?

MultiFile Upload?上传插件介绍:

官方DEMO:

?

下面是对MultiFile Upload 插件的UI自定义和代码的翻译:

界面:

自定义UI组件:? FlashFileUpload.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" minWidth="955" minHeight="600"
              backgroundColor="#333333" horizontalCenter="0" verticalCenter
              creationComplete="initApp()">
    fx:Declarations>
        
    </fx:Script>
        <![CDATA[
            
            import com.newmediateam.fileIO.MultiFileUpload;
            
            
            import flash.media.Sound;
            import flash.media.SoundChannel;
            import flash.net.FileFilter;
            import flash.net.URLVariables;
            
            import mx.controls.Alert;
            
            import mx.core.SoundAsset;
            
            public var multiFileUpload:MultiFileUpload;
            
            // 传送完成音乐
            [Embed(source="assets/audio/Ding.mp3")]
            public var soundClass:Class;
            public var snd:SoundAsset = new soundClass() as SoundAsset;
            public var sndChannel:SoundChannel;
            
            // 设置文件过滤器
            public var imageTypes:FileFilter = new FileFilter("Images (*.jpg; *.jpeg; *.gif; *.png)","*.jpg; *.jpeg; *.gif; *.png");
            public var videoTypes:FileFilter = new FileFilter("Flash Video Files (*.flv)","*.flv");
            public var documentTypes:FileFilter = new FileFilter("Documents (*.pdf),(*.doc),(*.rtf),(*.txt)",("*.pdf; *.doc; *.rtf,*.txt"));
            
            // 将文件过滤器装载如数组 递给MultiFileUpload
            public var filesToFilter:Array = new Array(imageTypes,videoTypes,documentTypes);
            
            public var uploadDestination:String = "http://www.li-cheng.cn";  // 修改服务端上传控制器
            
            public function initApp():void{
                
                var postVariables:URLVariables = new URLVariables;
                postVariables.projectID = 55;
                postVariables.test ="Hello World";    
                
                multiFileUpload = new MultiFileUpload(
                    filesDG,browseBTN,clearButton,delButton,upload_btn,progressbar,uploadDestination,postVariables,11534336,filesToFilter
                );
                
                multiFileUpload.addEventListener(Event.COMPLETE,uploadsfinished);  //事件有分配
                
            }
            
            public function uploadsfinished(event:Event):void{
                
                sndChannel=snd.play();  //播放音频文件
                
            }
            

        ]]>
    >
    
    
    s:Group horizontalCenter top="100"  width="708" height="408" s:BitmapImage source="@Embed('/assets/images/RasterizedItems.png')"   /> <!--背景图片-->
        s:SkinnableContainer ="638"="308" skinClass="skins.SkinnableContainer">
             s:layout>
                 s:VerticalLayout paddingLeft="15" paddingRight="23" paddingTop paddingBottom="23" />
             >
            数据列表-->
             s:DataGrid id="filesDG" requestedRowCount="4" rowHeight="40"   width="100%"="200"   skinClass="skins.DG" >
                 <s:columns>
                     <s:ArrayList>
                         <s:GridColumn dataField="a" headerText="#" headerRenderer="components.GridHeaderRenderer"  itemRenderer="components.GridItemRenderer"></s:GridColumn>
                         <s:GridColumn dataField="b" headerText="歌曲" headerRenderer="components.GridHeaderRenderer"  itemRenderer="components.GridItemRenderer"></s:GridColumn>
                     </s:ArrayList>
                 </s:columns>s:DataGrids:HGroup width="65%"进度条-->
                mx:ProgressBar 
                    ="progressbar"
                    width 
                    labelPlacement="right"
                    barSkin="skins.ProgressBar.CustomProgressSkin"
                    trackSkin="skins.ProgressBar.CustomProgressBarTrackSkin"
                    color="0xFFFFFF"
                    minimum 
                    visible="true"
                    maximum 
                    label="CurrentProgress 0%" 
                    direction
                    mode="manual" 
                    />
            s:HGroup按钮们-->
            gap="10"="10"s:Button ="browseBTN"="skins.buttonSkin4" label="浏览" fontFamily="微软雅黑"/>
                ="upload_btn"="skins.buttonSkin5"="上传"s:Button  ="delButton"="skins.buttonSkin6"="移除"="clearButton"="移除全部"s:SkinnableContainers:Group>
    
s:Application>

?

主程序代码:? MultiFileUpload.as
// 例子: // multiFileUpload = new MultiFileUpload( filesDG,DataGrid组件 browseBTN,浏览按钮 clearButton,清楚全部 delButton,清楚选中 upload_btn,上传按钮 progressbar,进度条 "http://[Your Server Here]/MultiFileUpload/upload.cfm",上传地址 控制器 postVariables,上传参数 350000,最大文件大小 0 (零)值=没有文件限制 filesToFilter 文件过滤数组 ); package com.newmediateam.fileIO { 倒入包 import components.GridHeaderRenderer; import components.GridItemRenderer; import flash.events.*; import flash.net.FileFilter; import flash.net.FileReference; import flash.net.FileReferenceList; import flash.net.URLRequest; import flash.net.URLVariables; import mx.collections.ArrayCollection; import mx.collections.ArrayList; import mx.controls.Alert; import mx.controls.ProgressBar; import mx.controls.ProgressBarMode; import mx.core.ClassFactory; import mx.events.CollectionEvent; import spark.components.Button; import spark.components.DataGrid; import spark.components.gridClasses.GridColumn; public class MultiFileUpload { UI 变量 private var _datagrid:DataGrid; var _browsebutton:Button; var _remselbutton:Button; var _remallbutton:Button; var _uploadbutton:Button; var _progressbar:ProgressBar; var _testButton:Button; DataGrid 列 var _nameColumn:GridColumn; var _typeColumn:GridColumn; var _sizeColumn:GridColumn; var _creationDate:GridColumn; var _modificationDate:GridColumn; var _progressColumn:GridColumn; var _columns:ArrayList; 文件参考变量 [Bindable] var _files:ArrayCollection; var _fileref:FileReferenceList FileReferenceList 类提供了让用户选择一个或多个要上载的文件的方法。 var _file:FileReference; FileReference 类提供了在用户计算机和服务器之间上载和下载文件的方法 var _uploadURL:URLRequest; var _totalbytes:Number; 文件过滤数组 var _filefilter:Array; 配置变量 var _url:String; 文件上传URL var _maxFileSize:Number; 允许上次的最大文件大小 单位字节 var _variables:URLVariables; 上传变量 类似 ?a=hello&b=world 构造器 function MultiFileUpload( dataGrid:DataGrid,browseButton:Button,removeAllButton:Button,removeSelectedButton:Button,uploadButton:Button,progressBar:ProgressBar,url:String,variables:URLVariables,maxFileSize:Number,filter:Array ){ _datagrid = dataGrid; _browsebutton = browseButton; _remallbutton = removeAllButton; _remselbutton = removeSelectedButton; _uploadbutton = uploadButton; _url = url; _progressbar = progressBar; _variables = variables; _maxFileSize = maxFileSize; _filefilter = filter; init(); 调用初始化话函数 } 初始化函数 function init():void{ 设置文件 ArrayCollection 和 文件处理变量 _files = new ArrayCollection(); _fileref = new FileReferenceList; _file = new FileReference; 设置总字节数 _totalbytes = 0; 给UI组件监听事件 _browsebutton.addEventListener(MouseEvent.CLICK,browseFiles); _uploadbutton.addEventListener(MouseEvent.CLICK,uploadFiles); _remallbutton.addEventListener(MouseEvent.CLICK,clearFileCue); _remselbutton.addEventListener(MouseEvent.CLICK,removeSelectedFileFromCue); _fileref.addEventListener(Event.SELECT,selectHandler); _files.addEventListener(CollectionEvent.COLLECTION_CHANGE,popDataGrid); 集合数据变化是监听此函数 设置进度条参数 _progressbar.mode = "manual"; 指定用于更新进度栏的方法。 _progressbar.label = ""; 设置按钮组件 _uploadbutton.enabled = false; _remselbutton.enabled = false; _remallbutton.enabled = false; 设置 DataGrid 控件 _nameColumn = new GridColumn; _typeColumn = new GridColumn; _sizeColumn = new GridColumn; _nameColumn.dataField = "name"; _nameColumn.headerText= "文件"; _nameColumn.headerRenderer=new ClassFactory(GridHeaderRenderer); _typeColumn.dataField = "type"; _typeColumn.headerText = "类型"; _typeColumn.width = 80; _typeColumn.headerRenderer=new ClassFactory(GridHeaderRenderer); _sizeColumn.dataField = "size"; _sizeColumn.headerText = "文件大小"; _sizeColumn.labelFunction = bytesToKilobytes as Function; Label处理函数 _sizeColumn.width = 150; _sizeColumn.headerRenderer=new ClassFactory(GridHeaderRenderer); _columns = new ArrayList([_nameColumn,_typeColumn,_sizeColumn]); _datagrid.columns=_columns; _datagrid.sortableColumns = false; 排序 _datagrid.dataProvider = _files; 数据绑定 设置URL请求对象和地址 _uploadURL = new URLRequest; _uploadURL.url = _url; _uploadURL.method = "POST"; 设置请求方式 可以为POST和GET .. _uploadURL.data = _variables; 变量 _uploadURL.contentType = "multipart/form-data"; 请求类型声明 如果要上传二进制数据这个必须 } /******************************************************** * 私有方法 * ********************************************************/ 流量文件 多文件流量 function browseFiles(event:Event):void{ _fileref.browse(_filefilter); } 上传文件 function uploadFiles(event:Event):void{ if (_files.length > 0){ _file = FileReference(_files.getItemAt(0)); _file.addEventListener(Event.OPEN,openHandler); 前置操作 _file.addEventListener(ProgressEvent.PROGRESS,progressHandler); _file.addEventListener(Event.COMPLETE,completeHandler); _file.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);当对 FileReference.upload() 或 FileReference.download() 方法的调用尝试将文件上载到调用方安全沙箱外部的服务器,或是从调用方安全沙箱外部的服务器上下载文件时进行调度。 _file.addEventListener(HTTPStatusEvent.HTTP_STATUS,httpStatusHandler);当上载失败并且存在可用来描述失败的 HTTP 状态代码时调度。 _file.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);当上载或下载失败时调度。 _file.upload(_uploadURL); setupCancelButton(true); } } 删除选定的文件 function removeSelectedFileFromCue(event:Event):if (_datagrid.selectedIndex >= 0){ _files.removeItemAt( _datagrid.selectedIndex); } } 删除全部文件 function clearFileCue(event:Event):void{ _nameColumn.itemRenderer=null; _typeColumn.itemRenderer=null; _sizeColumn.itemRenderer=null; _files.removeAll(); } 取消当前文件上传 function cancelFileIO(event:Event):void{ _file.cancel(); setupCancelButton(false); checkCue(); } 文件类型列 label处理函数 function bytesToKilobytes(data:Object,blank:Object):String { var kilobytes:String; kilobytes = String(Math.round(data.size/ 1024)) + ' kb'; return kilobytes } 设置进度条Labe值 function getByteCount():void{ var i:int; _totalbytes = 0; for(i=0;i < _files.length;i++){ _totalbytes += _files[i].size; } _progressbar.label = "文件: "+ _files.length+ "大小: " + Math.round(_totalbytes/1024) + " kb" } 检查文件不超过maxFileSize为|如果_maxFileSize == 0没有文件限制设置 function checkFileSize(filesize:Number):Boolean{ var r:Boolean = false; if filesize greater then _maxFileSize if (filesize > _maxFileSize){ r = false; trace("false"); }else if (filesize <= _maxFileSize){ r = true; trace("true"); } if (_maxFileSize == 0){ r = true; } return r; } 重新设置进度条 function resetProgressBar():void{ _progressbar.label = ""; _progressbar.maximum = 0; _progressbar.minimum = 0; } reset form item elements 重置所有的元素 function resetForm():void{ _uploadbutton.enabled = false; _uploadbutton.addEventListener(MouseEvent.CLICK,uploadFiles); _uploadbutton.label = "上传"; _progressbar.maximum = 0; _totalbytes = 0; _progressbar.label = ""; _remselbutton.enabled = false; _browsebutton.enabled = true; } 每当_FILES的ArrayCollection改变这个函数被调用,以确保数据网格的数据的一致 function popDataGrid(event:CollectionEvent):void{ getByteCount(); checkCue(); } enable or disable upload and remove controls based on files in the cue; 启用上传和清楚按钮 function checkCue():void{ if (_files.length > 0){ _uploadbutton.enabled = true; _remselbutton.enabled = true; _remallbutton.enabled = true; }else{ resetProgressBar(); _uploadbutton.enabled = false; } } toggle upload button label and function to trigger file uploading or upload cancelling 上传按钮和取消按钮的切换 和功能的切换 function setupCancelButton(x:Boolean):if (x == true){ _uploadbutton.label = "取消"; _browsebutton.enabled = false; _remselbutton.enabled = false; _remallbutton.enabled = false; _uploadbutton.addEventListener(MouseEvent.CLICK,cancelFileIO); }false){ _uploadbutton.removeEventListener(MouseEvent.CLICK,cancelFileIO); resetForm(); } } ******************************************************** * File IO Event Handlers * *********************************************************/ called after user selected files form the browse dialouge box. 文件被选中后执行的响应函数 function selectHandler(event:Event):void { var i:int; var msg:String =""; var dl:Array = []; for (i=0;i < event.currentTarget.fileList.length; i ++){ if (checkFileSize(event.currentTarget.fileList[i].size)){ _files.addItem(event.currentTarget.fileList[i]); trace("under size " + event.currentTarget.fileList[i].size); } else { dl.push(event.currentTarget.fileList[i]); trace(event.currentTarget.fileList[i].name + " too large"); } _nameColumn.itemRenderer=new ClassFactory(GridItemRenderer); _typeColumn.itemRenderer=new ClassFactory(GridItemRenderer); _sizeColumn.itemRenderer=new ClassFactory(GridItemRenderer); _sizeColumn.labelFunction = bytesToKilobytes as Function; Label处理函数 } if (dl.length > 0){ for (i=0;i<dl.length;i++){ msg += String(dl[i].name + " 文件过大. n"); } mx.controls.Alert.show(msg + "文件最大为: " + Math.round(_maxFileSize / 1024) + " kb","文件过大",4,null).clipContent; } } 文件被打开 上传之前的响应函数 function openHandler(event:Event):void{ trace('openHandler triggered'); _files; } 文件上传被上传的每个文件的过程中调用|我们用这个来养活进度条的数据 function progressHandler(event:ProgressEvent):void { _progressbar.setProgress(event.bytesLoaded,event.bytesTotal); 设置进度条的状态 _progressbar.label = "Uploading " + Math.round(event.bytesLoaded / 1024) + " kb of " + Math.round(event.bytesTotal / 1024) + " kb " + (_files.length - 1) + "剩余"; } 所谓的后一个文件已被successully上传|我们利用这一点来检查是否有任何文件留下来上传和如何处理它 上传完成 function completeHandler(event:Event):void{ _files.removeItemAt(0); 移除集合中的第0号元素 if (_files.length > 0){ _totalbytes = 0; uploadFiles(null); }else{ setupCancelButton(false); _progressbar.label = "上传完成"; var uploadCompleted:Event = new Event(Event.COMPLETE); 完成时创建一个事件 dispatchEvent(uploadCompleted); 把事件分配出去 } } function ioErrorHandler(event:IOErrorEvent):trace('And IO Error has occured:' + event); mx.controls.Alert.show(String(event),0); line-height:1.5!important">"ioError",0); } function securityErrorHandler(event:SecurityErrorEvent):void{ mx.controls.Alert.show(String(event),"Security Error",0); } function cancelHandler(event:Event):'cancelled'); } function httpStatusHandler(event:HTTPStatusEvent):if (event.status != 200){ mx.controls.Alert.show(String(event),0); line-height:1.5!important">"Error",0); } } } }

演示地址:?http://www.li-cheng.cn/demo/FlashFileUpload/FlashFileUpload.html

资料下载:????http://pan.baidu.com/share/link?shareid=1217875474&uk=1545675865

作者: Li-Cheng
出处:? http://www.cnblogs.com/Li-Cheng/p/3585668.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读