關鍵字:javascript
SecurityErrorEvent socket as3php
flash有着本身的一套安全處理模式,在socket方面,我這樣的菜鳥沒法理解他的好處:一句話,不懷好意的人若是想用flash寫一段帶破壞意義的socket客戶端(我這裏只談客戶端,不談as3 作 socketserver)程序,你給禁止了,他能夠用其餘的程序,實際上,這種人也不會用flash去寫;你的這些安全的東東實際給真正的使用者帶來不少的麻煩。html
抱怨的話只能說說,咱們沒法改變,說說解決方案,java
網上通常有如下關於SecurityErrorEvent處理的方式:node
1 Security.allowDomain("*");apache
2 Security.loadPolicyFile("http://oa.oa.com/crossdomain.xml");安全
3 <policy-file-request/> <cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>服務器
4 <param value="all" name="allowNetworking">app
第3種是socket服務器用到的,dom
-------------------------------------------------------
我遇到的問題是——我要作文件上傳進度,網上流行的方法是用FileReference的upload,我不想用,由於我有用URLRequest+loader的上傳代碼。
個人代碼是正常向apache+php的服務器發送正常的post表單,代碼也徹底沒有特殊的地方,可是URLRequest不能表現上傳的進度,只能表示下載的進度,因此,我想用socket去實現,寫好代碼以後,出問題了,安全問題,我先試了上面的1 2 4,結果都不行,由於是apache作的服務器端,第三種派不上用場。
看了這篇文章:
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html
我瞭解到flash能夠有一個統一的」socket安全配置服務器「,端口是843,因而我寫了一個安全配置服務器,php的,代碼以下:
<?php define('policy_request', "<policy-file-request/>"); define('policy_response', '<cross-domain-policy><allow-access-from domain="*" to-ports="*"/></cross-domain-policy>'); define('policy_response_len', strlen(policy_response)+1); define('EC', chr(10)); $host="0.0.0.0"; $port=843; $socket=socket_create(AF_INET,SOCK_STREAM,0); if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) { echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL; } socket_bind($socket,$host,$port); $rett=socket_listen($socket,3); //socket_set_nonblock($socket); $clients = array($socket); while(1){ $read = $clients; $writes=NULL;$execs=NULL; if(socket_select($read, $writes, $execs, 2) < 1){ continue; } if(in_array($socket,$read)) { $clients[] = $newsock = socket_accept($socket); socket_set_nonblock($newsock); $key = array_search($socket,$read); unset($read[$key]); } foreach($read as $read_sock) { $data = trim(socket_read($read_sock, 512, PHP_BINARY_READ)); if($data == false) { $key = array_search($read_sock, $clients); unset($clients[$key]); socket_close($read_sock); continue; } if($data==policy_request){ socket_write($read_sock,policy_response, policy_response_len); }else socket_write($read_sock,"Bye".EC); socket_close($read_sock); $key = array_search($read_sock, $clients); unset($clients[$key]); } } socket_close($socket);
固然還遇到其它曲折,就是如何把ByteArray分段發送,見個人上一篇文章。
貼上完整的as代碼
package { import flash.display.DisplayObject; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.SimpleButton; import flash.display.Sprite; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.MouseEvent; import flash.events.ProgressEvent; import flash.events.SecurityErrorEvent; import flash.external.ExternalInterface; import flash.net.FileFilter; import flash.net.FileReference; import flash.net.FileReferenceList; import flash.net.Socket; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestHeader; import flash.net.URLVariables; import flash.system.Security; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.ByteArray; import flash.utils.setTimeout; import flash.events.OutputProgressEvent; public class ASUploader extends Sprite { public var btnTxtField:TextField = new TextField(); public var fileMulti:FileReferenceList; public var fileOne:FileReference; public var setParamList:Array; public var request:URLRequest; public var boundary:String = "---BbC04y";// 數據分界符 public var httpSeparator:String = "\r\n"; public var fileQueue:Object = {}; public var queueCounts:int = 0; // Values passed in from the HTML private var movieName:String; private var uploadUrl:String; private var lableText:String; private var textTopPadding:uint; private var textLeftPadding:uint; private var filePostName:String; private var postParams:Object; private var fileTypes:String; private var fileTypesDesc:String; private var fileTotalSize:int = 0; private var fileSizeLimit:int = 0; private var fileUploadLimit:int = 0; private var fileQueueLimit:int = 0; private var multiFiles:Boolean = true; private var requeueOnError:Boolean = false; private var httpSuccess:Array = []; //private var debugEnabled:Boolean; private var uploadCompleteHandler:String; private var uploadProgressHandler:String; private var fileSelectCompleteHandler:String; private var fileSelectStartHandler:String; private var buttonImage:String; public function ASUploader() { // 初始化參數 this.movieName = root.loaderInfo.parameters.movieName; this.uploadUrl = root.loaderInfo.parameters.uploadUrl; this.lableText = root.loaderInfo.parameters.lableText; this.textTopPadding = uint(parseInt(root.loaderInfo.parameters.textTopPadding)); this.textLeftPadding = uint(parseInt(root.loaderInfo.parameters.textLeftPadding)); this.filePostName = root.loaderInfo.parameters.filePostName; this.fileTypes = root.loaderInfo.parameters.fileTypes; this.fileTypesDesc = root.loaderInfo.parameters.fileTypesDesc + " (" + this.fileTypes + ")"; this.postParams = {"_PostFromASUploader_":"1"}; this.loadPostParams(root.loaderInfo.parameters.postParams); try{ buttonImage = root.loaderInfo.parameters.buttonImage; if(buttonImage==null) buttonImage = "http://oa.oa.com/images/green/pic.jpg"; }catch(e){ buttonImage = ""; } ExternalInterface.call("console.log",'>>> <<<<<< root.loaderInfo.parameters'+root.loaderInfo.parameters.buttonImage); if (! this.lableText) { this.lableText = "Please Select Files"; } if (! this.fileTypes) { this.fileTypes = "*.*"; } if (! this.fileTypesDesc) { this.fileTypesDesc = "All Files"; } try { this.fileUploadLimit = int(root.loaderInfo.parameters.fileUploadLimit); if (this.fileUploadLimit < 0) { this.fileUploadLimit = 0; } } catch (ex:Object) { this.fileUploadLimit = 0; } try { this.fileQueueLimit = int(root.loaderInfo.parameters.fileQueueLimit); if (this.fileQueueLimit < 0) { this.fileQueueLimit = 0; } } catch (ex:Object) { this.fileQueueLimit = 0; } try { this.multiFiles = root.loaderInfo.parameters.multiFiles; if (this.multiFiles == "false" || this.multiFiles == "0") { this.multiFiles = false; } else { this.multiFiles = true; } } catch (ex:Object) { this.multiFiles = false; } //Callback try { this.uploadCompleteHandler = root.loaderInfo.parameters.uploadCompleteHandler; } catch (ex:Object) { this.uploadCompleteHandler = ""; } try { this.fileSelectCompleteHandler = root.loaderInfo.parameters.fileSelectCompleteHandler; } catch (ex:Object) { this.fileSelectCompleteHandler = "fileSelected"; } try { this.fileSelectStartHandler = root.loaderInfo.parameters.fileSelectStartHandler; } catch (ex:Object) { this.fileSelectStartHandler = ""; } try { this.uploadProgressHandler = root.loaderInfo.parameters.uploadProgressHandler; } catch (ex:Object) { this.uploadProgressHandler = ""; } this.debug("this.fileSelectCompleteHandler: " + this.fileSelectCompleteHandler + ", this.uploadCompleteHandler: " + this.uploadCompleteHandler + ", this.uploadProgressHandler="+ this.uploadProgressHandler + ", this.multiFiles=" + this.multiFiles + ', this.fileQueueLimit='+this.fileQueueLimit); Security.allowDomain("*"); this.fileQueue = []; this.fileMulti = new FileReferenceList(); this.fileOne = null; this.buttonMode = true; this.useHandCursor = true; this.stage.align = "TL"; this.stage.scaleMode = "noScale"; //this.stage.addEventListener(Event.RESIZE, onResize); this.btnTxtField.htmlText = this.lableText; var format:TextFormat = new TextFormat("Georgia"); format.size = 18; this.btnTxtField.setTextFormat(format); this.btnTxtField.autoSize = "center"; this.btnTxtField.x = this.textLeftPadding; this.btnTxtField.y = this.textTopPadding; this.btnTxtField.border = false; this.btnTxtField.selectable = false; if(buttonImage.length<1){ addChild(this.btnTxtField); } else{ loadImg(buttonImage); } this.fileMulti.addEventListener(Event.COMPLETE, complete); this.fileMulti.addEventListener(Event.OPEN,open); this.fileMulti.addEventListener(Event.CANCEL, cancel); //點擊取消按鈕會廣播這個事件; this.fileMulti.addEventListener(Event.SELECT, select); this.fileMulti.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); //onResize(null); // 設置javascript要回調的函數 ExternalInterface.addCallback("sendPostDataToAs", addPostParams); ExternalInterface.addCallback("selectFiles", selectFiles); ExternalInterface.addCallback("upload", upload); ExternalInterface.addCallback("setParam", setParam); } private function loadImgCb(obj:DisplayObject){ try{ trace(obj); obj.x=0; obj.y=0; obj.addEventListener(MouseEvent.CLICK, selectFiles); }catch(e){ trace(e); } } /** * 打開選擇文件對話框 */ public function selectFiles(e:MouseEvent):void { try { this.queueCounts = 0; var allowed_file_types:String = "*.*"; var allowed_file_types_desc:String = "All Files"; if (this.fileTypes.length > 0) { allowed_file_types = this.fileTypes; } if (this.fileTypesDesc.length > 0) { allowed_file_types_desc = this.fileTypesDesc; } if (this.multiFiles) { this.fileMulti.browse([new FileFilter(allowed_file_types_desc, allowed_file_types)]); } else { this.fileOne = new FileReference(); this.fileOne.addEventListener(Event.SELECT, this.frefSelect); this.fileOne.addEventListener(Event.COMPLETE, frefComplete); this.fileOne.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); this.fileOne.browse([new FileFilter(allowed_file_types_desc, allowed_file_types)]); } } catch (ex:Error) { ExternalInterface.call("alert","doSeletFiles error:"+ex.toString()); this.debug("Exception: " + ex.toString()); } if(this.fileSelectStartHandler)ExternalInterface.call(this.fileSelectStartHandler); } private function frefSelect(e:Event):void { this.fileOne.load(); } /** * IO失敗 */ private function ioErrorHandler(event:IOErrorEvent):void { this.debug("ioErrorHandler: " + event); } /** * 設置參數 */ public function addPostParams(params:Object):void { for (var key:String in params) { this.postParams[key] = params[key]; } } /** * 設置參數,給js調用 */ private function setParam(key:String, value:String) { this.postParams[key] = value; } /** * 上傳已選文件 */ public function upload():void { uploadUrl = 'http://oa.*.net/u.php';trace(uploadUrl); uploadWidthSocket(); /*this.request = new URLRequest(uploadUrl); this.request.method = "POST"; this.setHeader("Cache-Control", "no-cache"); this.setHeader("Content-Type", "multipart/form-data;boundary=" + boundary); this.request.data = new ByteArray ; this.writeBodyData(this.fileQueue); this.writeBodyData(this.postParams); this.request.data.writeUTFBytes("--" + boundary + "--"); this.request.data.writeUTFBytes(httpSeparator); var loader:URLLoader = new URLLoader(); loader.dataFormat = "binary"; loader.addEventListener(Event.COMPLETE, uploadComplete); loader.addEventListener(ProgressEvent.PROGRESS, progressHandler); loader.load(request); */ } private function parseUrl(url:String) :Object{ var rtn:Object=new Object(); var proto:String= "http"; if(url.toLowerCase().indexOf("http://")==0){ url =url.substring(7); } trace("parseUrl 1: "+url); var host:String=""; var uri:String=""; var port:int = 80; if(url.indexOf("/")!=-1){ host = url.substr(0, url.indexOf("/")) uri = url.substr(url.indexOf("/")) }else{ host= url; uri = "/"; } if(host.indexOf(':')!=-1){ port =int( host.substr(host.indexOf(':')+1)); host = host.substr(0, host.indexOf(':')-1); } return {'proto': proto, 'host':host,'port':port, 'uri': uri}; } var socket:Socket ; var headers:String=''; public function uploadWidthSocket():void{ var path:Object = parseUrl(uploadUrl); for(var a:String in path) trace(a+"="+path[a]); this.debug("uploadWidthSocket 1:"); this.request = new URLRequest(uploadUrl); this.request.data = new ByteArray ; //this.request.data.writeUTFBytes(headers); this.writeBodyData(this.fileQueue); this.postParams= {'B':"1",'C':"2" }; this.writeBodyData(this.postParams); this.request.data.writeUTFBytes("--" + boundary + "--"); this.request.data.writeUTFBytes(httpSeparator); this.request.data.position = 0; //var _d: ByteArray = new ByteArray; //_d.endian = Endian.BIG_ENDIAN ; //_d.writeBytes(request.data as ByteArray); this.debug("uploadWidthSocket 2:"); headers= "POST "+path.uri+"?a=1"+' HTTP/1.1'+httpSeparator + 'Host: '+path.host +httpSeparator + 'Cache-Control: no-cache'+httpSeparator +"Content-Type: multipart/form-data;boundary=" + boundary+httpSeparator + 'Content-Length: '+this.request.data.bytesAvailable+httpSeparator +"Connection: Close"+httpSeparator+httpSeparator; //Security.loadPolicyFile("http://oa.oa.com/crossdomain.xml"); socket = new Socket(); socket.endian = flash.utils.Endian.BIG_ENDIAN; socket.addEventListener(Event.CLOSE,closeHandler); socket.addEventListener(Event.CONNECT,onConnectEvent); socket.addEventListener(IOErrorEvent.IO_ERROR,onDataError); socket.addEventListener(ProgressEvent.SOCKET_DATA,onDataEvent); socket.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS,progressHandlerSocket); socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); this.debug("uploadWidthSocket 3:"); this.debug(path.host+ ":"+ path.port); d = new ByteArray ; d.writeUTFBytes(headers); d.writeBytes(this.request.data as ByteArray); d.position = 0; total_length = d.length; per = int(total_length /100); if(per<512) per = 512; if(per>20480) per = 20480; read_total = 0; socket.connect(path.host, path.port);//); //socket.connect("192.168.0.97", 843);//); } private function closeHandler(event:Event):void { this.debug("closeHandler:"+ event); } var total_length:int; var per:int; var d:ByteArray; var read_total:int; private function onConnectEvent(event:Event):void { this.debug(headers); this.debug("total_length="+total_length+",per="+per); this.debug("uploadWidthSocket 4:"); sendASection(); } var tmp:ByteArray = new ByteArray(); private function sendASection():void{ if(d.bytesAvailable>0){ try{ tmp = new ByteArray (); tmp.clear(); tmp.position = 0; var read_length = d.bytesAvailable>per?per:d.bytesAvailable; trace(read_total +","+ read_length); d.readBytes(tmp, 0, read_length); tmp.position = 0; read_total+=tmp.length; trace( "progressHandler d.position:" + (d.position)+", current sent: "+tmp.bytesAvailable+"-"+ tmp.length+"/"+read_length+ ", left: "+ d.bytesAvailable + ", total_length=" + total_length ); socket.writeBytes(tmp as ByteArray); socket.flush(); if (this.uploadProgressHandler) { //this.uploadProgressHandler try{ ExternalInterface.call(this.uploadProgressHandler, d.position, total_length); }catch(e){ trace(e) } } //if(tmp.length<per) break; }catch(e){ this.debug(e); //break; } }else trace("----------------------DONE ?--------------------------"); } private function onDataEvent(event:ProgressEvent):void { var src:String = socket.readUTFBytes(socket.bytesAvailable); this.debug("onDataEvent:"+ src); } private function onDataError(Error:IOErrorEvent) { this.debug("onDataError:"+ Error); } private function progressHandlerSocket(event:OutputProgressEvent):void { //this.debug("progressHandler loaded:" + event.bytesPending + " total: " + event.bytesTotal); sendASection() } private function securityErrorHandler(event:SecurityErrorEvent):void { this.debug('AAAAA1 安全錯誤,關閉鏈接'); } private function progressHandler(event:ProgressEvent):void { if (this.uploadProgressHandler) { this.debug("progressHandler loaded 0:" + event.bytesLoaded + " total: " + event.bytesTotal); //this.uploadProgressHandler ExternalInterface.call(this.uploadProgressHandler, event.bytesLoaded, event.bytesTotal); } this.debug("progressHandler loaded 1:" + event.bytesLoaded + " total: " + event.bytesTotal); } /** * 上傳完成處理方法 */ public function uploadComplete(event:Event):void { // JS有上傳完成回調函數,則調用 if (this.uploadCompleteHandler) { // event.target.data.toString() 服務端返回的字符串 ExternalInterface.call(this.uploadCompleteHandler, event.target.data.toString()); } } public function complete(e:Event):void { } public function open(e:Event):void { } public function cancel(e:Event):void { } public function select(e:Event):void { this.debug("select 1:"); for (var i:uint=0; i<this.fileMulti.fileList.length; i++) { this.fileMulti.fileList[i].addEventListener(Event.COMPLETE, frefComplete); this.fileMulti.fileList[i].addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); this.fileMulti.fileList[i].load(); } } public function frefComplete(e:Event):Boolean { this.debug("select 2:"); var contentType:String = "unknow"; if (e.target.type == ".gif") { contentType = "image/gif"; } else if (e.target.type == ".png") { contentType = "image/png"; } else if (e.target.type == ".doc") { contentType = "application/msword"; } else if (e.target.type == ".docx") { contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; } else if (e.target.type == ".xls") { contentType = "application/vnd.ms-excel"; } else if (e.target.type == ".xlsx") { contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } else if (e.target.type == ".ppt") { contentType = "application/vnd.ms-powerpoint"; } else if (e.target.type == ".pptx") { contentType = "application/vnd.openxmlformats-officedocument.presentationml.presentation"; } else if (e.target.type == ".pdf") { contentType = "application/pdf"; } else if (e.target.type == ".zip") { contentType = "application/x-zip-compressed"; } else if (e.target.type == ".wav") { contentType = "audio/wav"; } else if (e.target.type == ".bmp") { contentType = "image/bmp"; } else if (e.target.type == ".mp3") { contentType = "audio/mpeg"; } else if (e.target.type == ".jpg") { contentType = "image/jpeg"; } if (e.target.size == 0) { return false; } this.fileTotalSize += e.target.size; if (this.fileSizeLimit > 0 && this.fileTotalSize > this.fileSizeLimit) { return false; } ExternalInterface.call(this.fileSelectCompleteHandler!=null&&this.fileSelectCompleteHandler.length>0?this.fileSelectCompleteHandler:'fileSelected', e.target.name, e.target.size, this.movieName); var mimeType:String = "text/plain"; var byte1:int = e.target.data.readUnsignedByte(); var byte2:int = e.target.data.readUnsignedByte();trace("6.4"); if (e.target.data is ByteArray) { mimeType = getMimeTypeFromBytes(byte1,byte2); this.fileQueue[queueCounts] = {"mimeType":mimeType,"filename":e.target.name,"data":e.target.data}; this.queueCounts++; } else {//可能上傳文本文件 this.fileQueue[queueCounts] = {"mimeType":mimeType,"filename":e.target.name,"data":e.target.data}; this.queueCounts++; } if (this.fileQueueLimit > 0 && this.queueCounts > this.fileQueueLimit) { return false; } else {trace("6.6"); upload(); return true; } return true; } /** * 根據文件頭兩字節來判斷MimeType類型 */ public function getMimeTypeFromBytes(byte1:int, byte2:int):String { var code:String = byte1 + "" + byte2; var mimeType:String = "UnKnow"; switch (code) { case "7790" : mimeType = 'application/octet-stream'; case "6787" : mimeType = 'application/x-shockwave-flash'; break; case "8075" : mimeType = 'application/bmp'; break; case "6677" : mimeType = 'image/bmp'; break; case "7173" : mimeType = 'image/gif'; break; case "255216" : mimeType = 'image/jpeg'; break; case "13780" : mimeType = 'image/png'; break; case "79103" : mimeType = 'application/ogg'; break; } return mimeType; } public function setHeader(headerName:String, headerValue:String):void { request.requestHeaders.push(new URLRequestHeader(headerName, headerValue)); } /** * 向發送請求類寫入二進制數據 * */ public function writeBodyData(srcData:Object):void { var key:String; for (key in srcData) { trace(key+"="+srcData[key]); if (srcData[key] is String) { this.request.data.writeUTFBytes("--" + boundary); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes("Content-Disposition: form-data; name=\"" + key + "\""); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes(srcData[key]); this.request.data.writeUTFBytes(httpSeparator); } else if (srcData[key].data is ByteArray) { this.request.data.writeUTFBytes("--" + boundary); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes("Content-Disposition: form-data; name=\"" + key + "\"; filename=\"" + srcData[key].filename + "\""); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes("Content-Type: " + srcData[key].mimeType); //Content-Type; this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeUTFBytes(httpSeparator); this.request.data.writeBytes(srcData[key].data, 0, srcData[key].data.length); this.request.data.writeUTFBytes(httpSeparator); } } } /** * 加載要POST的參數 */ private function loadPostParams(param_string:String):void { if (param_string != null) { var name_value_pairs:Array = param_string.split("&"); var key:String = ""; var val:String = ""; for (var i:Number = 0; i < name_value_pairs.length; i++) { var name_value:String = String(name_value_pairs[i]); var index_of_equals:Number = name_value.indexOf("="); if (index_of_equals > 0) { key = decodeURIComponent(name_value.substring(0,index_of_equals)); val = decodeURIComponent(name_value.substr(index_of_equals + 1)); this.postParams[key] = val; } } } } public function debug(debugInfo:String):void { trace(debugInfo); ExternalInterface.call("console.log",debugInfo.replace("'","\\'")); } private function loadImg(url:String) { var loader:Loader = new Loader(); loader.load(new URLRequest(url)); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onCompleteloadImg); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler1); } function onCompleteloadImg(e:Event):void { var button:SimpleButton = new SimpleButton(e.currentTarget.content,e.currentTarget.content,e.currentTarget.content,e.currentTarget.content); button.x = 0; button.y = 0; loadImgCb(addChild(button)); } private function ioErrorHandler1(event:IOErrorEvent):void { trace("ioErrorHandler: " + event); loadImg(buttonImage); } } }
調用flash的js
/** * ASUploader: http://ASUploader.googlecode.com * * @copyright (c) 2011 * @author Joseph Chen * @release MIT License: * @link http://www.opensource.org/licenses/mit-license.php */ function ASUploader(setting) { this.setting = setting; this.movieId = 0; this.swfObject = false; //init setting this.init = function() { // flash settings this.movieName = 'ASUploader_' + this.movieId; this.placeHolderId = 'ASUploaderPlaceHolder'; this.flashUrl = 'ASUploader.swf'; this.swfVersionStr = '10.0.0'; //this.xiSwfUrlStr = 'playerProductInstall.swf'; // flash display this.lableText = 'Please Select Files'; this.buttonTextStyle = 'display:block;text-align:left;color: #000000;font-size: 20px;'; this.width = 100; this.height = 30; this.textTopPadding = 0; this.textLeftPadding = 0; // upload server settings this.uploadUrl = 'upload.php'; this.queryString = ''; this.postParams = ''; // file settings this.fileTypesDesc = 'All Files';//Image this.fileTypes = '*.*';//*.png;*.jpg;*.gif this.fileSizeLimit = 0;// zero means 'unlimited' this.fileUploadLimit = 0; this.fileQueueLimit = 0; this.multiFiles = true; this.buttonImage = ""; //Event Handlers this.fileSelectStartHandler = null; this.fileSelectCompleteHandler = null; this.uploadCompleteHandler = 'completeCallback'; this.uploadProgressHandler = 'uploadProgressCallbak'; for (var name in setting) { if (this.setting[name] != undefined) { this[name] = this.setting[name]; } else if (this[name] == undefined) { continue; } } // 要在setting初始化後設置下面的參 this.postParams = this.buildParams(setting.postParams); this.flashParams = { quality : 'high', bgcolor : '#ffffff', allowscriptaccess : 'always', allowfullscreen : 'true' }; this.flashAttributes = { id : this.movieName, name : this.movieName, align : 'middle' } return this; }; // 獲取傳遞給swf的參數 this.getFlashVars = function() { return flashvars = { movieName : this.movieName, swfVersionStr : this.swfVersionStr, lableText : this.lableText, width : this.width, height : this.height, textTopPadding : this.textTopPadding, textLeftPadding : this.textLeftPadding, buttonTextStyle : this.buttonTextStyle, uploadUrl : this.uploadUrl, queryString : this.queryString, postParams : this.postParams, fileTypesDesc : this.fileTypesDesc, buttonImage : this.buttonImage, fileTypes : this.fileTypes, fileSizeLimit : this.fileSizeLimit, fileUploadLimit : this.fileUploadLimit, fileSizeLimit : this.fileSizeLimit, fileQueueLimit : this.fileQueueLimit, multiFiles : this.multiFiles, buttonImage : this.buttonImage, uploadProgressHandler : this.uploadProgressHandler, uploadCompleteHandler : this.uploadCompleteHandler, fileSelectCompleteHandler : this.fileSelectCompleteHandler, fileSelectStartHandler : this.fileSelectStartHandler }; }; this.getFlashVarsString = function() { flashvars = this.getFlashVars(); var string = ''; for (var key in flashvars) { try{ if (flashvars[key] == null) flashvars[key] = ''; if (string == '') { string += key+'='+encodeURIComponent(flashvars[key].toString()); } else { string += '&' +key+ '=' + encodeURIComponent(flashvars[key].toString()); } }catch(e){ alert(e) } } return string; }; // 建立FLASH this.create = function (movieName) { if (movieName) { this.movieName = movieName; } var flashHtml = '<object align="'+this.flashAttributes.align+'" width="'+this.width+'" height="'+this.height+'"' + ' id="'+this.flashAttributes.id+'" name="'+this.flashAttributes.name+'"' + ' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">' + '<param name="movie" value="'+this.flashUrl+'" />' + '<param name="allowNetworking" value="all" />' + '<param name="quality" value="'+this.flashParams.quality+'">' + '<param name="bgcolor" value="'+this.flashParams.bgcolor+'">' + '<param name="allowfullscreen" value="'+this.flashParams.allowfullscreen+'">' + '<param name="allowscriptaccess" value="'+this.flashParams.allowscriptaccess+'">' + '<param name="flashvars" value="'+this.getFlashVarsString()+'">' + ' <!--[if !IE]>-->' + ' <object type="application/x-shockwave-flash" data="'+this.flashUrl+'"' + ' width="'+this.width+'" height="'+this.height+'"' + ' id="'+this.flashAttributes.id+'" name="'+this.flashAttributes.name+'"' + ' style="visibility: visible;">' + ' <param name="quality" value="'+this.flashParams.quality+'">' + ' <param name="bgcolor" value="'+this.flashParams.bgcolor+'">' + ' <param name="menu" value="false" />' + ' <param name="allowNetworking" value="all" />' + ' <param name="wmode" value="opaque" />' + ' <param name="allowfullscreen" value="'+this.flashParams.allowfullscreen+'">' + ' <param name="allowscriptaccess" value="'+this.flashParams.allowscriptaccess+'">' + ' <param name="flashvars" value="'+this.getFlashVarsString()+'">' + ' <!--<![endif]-->\n' + ' <!--[if gte IE 6]>-->\n' + ' <p>Either scripts and active content are not permitted to run or Adobe Flash Player version' + ' '+this.swfVersionStr+' or greater is not installed.' + ' </p>\n' + ' <!--<![endif]-->\n' + ' <a href="http://www.adobe.com/go/getflashplayer">' + ' <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif"' + ' alt="Get Adobe Flash Player" /></a>\n' + ' <!--[if gte IE 6]>-->\n' + ' </object>\n' + ' <!--<![endif]-->\n' + '</object>'; var targetElement, tempParent; // Make sure an element with the ID we are going to use doesn't already exist if (document.getElementById(this.movieName) !== null) { throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"; } // Get the element where we will be placing the flash movie targetElement = document.getElementById(this.placeHolderId); if (targetElement == undefined) { throw "Could not find the placeholder element: " + this.placeHolderId; } tempParent = document.getElementById(movieName+'_swf'); // Append the container and embed the flash if(!tempParent) { tempParent = document.createElement("div"); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) tempParent.innerHTML = flashHtml; //targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); targetElement.parentNode.appendChild(tempParent.firstChild); }else tempParent.innerHTML = flashHtml; // Fix IE Flash/Form bug if (window[this.movieName] == undefined) { window[this.movieName] = this.getMovieElement(); } return this; }; // 組裝傳遞給swf的額外參數(用來swf向服務器程序提交的參數 this.buildParams = function (params) { var paramPairs = []; if (typeof(params) === 'object') { for (var key in params) { paramPairs.push(key.toString() + '=' + params[key].toString()); } } return paramPairs.join('&'); }; // 開始上傳 this.upload = function() { if (!this.flash) { this.flash = this.getObjectById(this.movieName); } if (this.flash && this.flash.upload != undefined) { this.flash.upload(); } return this; }; // 開始上傳 this.selectFiles = function(e) { if (!this.flash) { this.flash = this.getObjectById(this.movieName); } if (this.flash && this.flash.selectFiles != undefined) { this.flash.selectFiles(e); } return this; }; // 設置參數 this.setParam = function(key, value) { if (!this.flash) { this.flash = this.getObjectById(this.movieName); } if (this.flash && this.flash.setParam != undefined) { this.flash.setParam(key, value+""); } return this; }; // 向swf發送要提交的參數數據 this.sendPostDataToAs = function(data) { if (!this.flash) { this.flash = this.getObjectById(this.movieName); } if (this.flash && this.flash.sendPostDataToAs != undefined) { this.flash.sendPostDataToAs(); } return this; }; this.getObjectById = function(id) { var r = null; var o = document.getElementById(id); if (o && o.nodeName == "OBJECT") { if (typeof o.SetVariable != 'undefined') { r = o; } else { var n = o.getElementsByTagName('OBJECT')[0]; if (n) { r = n; } } } return r; }; this.getMovieElement = function() { if (this.movieElement == undefined) { this.movieElement = document.getElementById(this.movieName); } if (this.movieElement === null) { throw "Could not find Flash element"; } return this.movieElement; }; // init this.init(); };
調用的js代碼:
if(typeof(hostname)=='undefined'){ hostname = window.location.href.replace(/^http\:\/\/([^\/]+)\/?.*$/,"$1"); } ASUploaderImg = (new ASUploader({ movieName : "ASUploaderFlash", uploadUrl : "index.php?m=upload_chat", lableText : "文件", textTopPadding : 0, textLeftPadding : 0, width : 16, height : 16, fileTypesDesc : "文件", fileTypes : "*.jpg;*.gif;*.png", postParams : {'multi_merge':1, "more_params":"much more"}, fileQueueLimit : 5, multiFiles : false, buttonImage : 'http://'+hostname+'/images/green/pic.jpg', uploadCompleteHandler: "uploadCompleteCallback", uploadProgressHandler: "uploadProgressCallback", fileSelectCompleteHandler : "fileSelected" })) .create('ASUploaderFlash');
個人QQ羣:
PHPer&Webgame&移動開發,羣號:95303036
個人QQ羣: PHPer&Webgame&移動開發,羣號:95303036