[Checkins] SVN: z3c.widget/trunk/src/z3c/widget/flashupload/ added filetype limitation support

Manfred Schwendinger manfred.schwendiger at lovelysystems.com
Tue Dec 12 12:02:14 EST 2006


Log message for revision 71539:
  added filetype limitation support

Changed:
  A   z3c.widget/trunk/src/z3c/widget/flashupload/README.txt
  U   z3c.widget/trunk/src/z3c/widget/flashupload/configure.zcml
  U   z3c.widget/trunk/src/z3c/widget/flashupload/flashuploadvars.pt
  U   z3c.widget/trunk/src/z3c/widget/flashupload/resources/Upload.as
  U   z3c.widget/trunk/src/z3c/widget/flashupload/resources/upload.swf
  U   z3c.widget/trunk/src/z3c/widget/flashupload/tests.py
  U   z3c.widget/trunk/src/z3c/widget/flashupload/upload.py

-=-
Added: z3c.widget/trunk/src/z3c/widget/flashupload/README.txt
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/README.txt	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/README.txt	2006-12-12 17:02:13 UTC (rev 71539)
@@ -0,0 +1,31 @@
+===================
+FLASH UPLOAD WIDGET
+===================
+
+the flashupload vars page configures the flash frontend
+    >>> from z3c.widget.flashupload import upload
+    >>> from zope.testing.doctestunit import DocTestSuite
+    >>> from zope.publisher.browser import TestRequest
+    >>> from zope.app.pagetemplate import ViewPageTemplateFile
+    >>> from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+    >>> request = TestRequest()
+    >>> context = object()
+    >>> viewClass = SimpleViewClass('flashuploadvars.pt', bases=(upload.FlashUploadVars,))
+    >>> view = viewClass(context, request)
+    >>> print view()
+    <?xml version="1.0" ?>
+    <var>
+        <var name="file_progress">File Progress</var>
+        <var name="overall_progress">Overall Progress</var>
+        <var name="error">Error on uploading files</var>
+        <var name="uploadcomplete">all files uploaded</var>
+    </var>
+    >>> view.allowedFileTypes = ('.jpg', '.gif')
+    >>> print view()
+    <?xml version="1.0" ?>
+    <var>
+    ...
+        <var name="allowedFileType">.jpg</var>
+        <var name="allowedFileType">.gif</var>
+     </var>
+    


Property changes on: z3c.widget/trunk/src/z3c/widget/flashupload/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/configure.zcml
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/configure.zcml	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/configure.zcml	2006-12-12 17:02:13 UTC (rev 71539)
@@ -5,38 +5,39 @@
     xmlns:zcml="http://namespaces.zope.org/zcml"
     xmlns:i18n="http://namespaces.zope.org/i18n"
     i18n:domain="z3c.widget.flashupload">
-
-    <!-- target for flash upload client -->
+  
+  <!-- target for flash upload client -->
     <browser:page
         for="zope.app.container.interfaces.IContainer"
         name="uploadfile"
         class=".upload.UploadFile"
         permission="zope.Public"
-    />
-
+        />
+    
     <configure zcml:condition="have zc.resourcelibrary">
-     <resourceLibrary name="z3c.widget.flashupload"
-                    require="z3c.javascript.prototype">
-      <directory source="resources" include="upload.js swfobject.js"/>
+      <resourceLibrary name="z3c.widget.flashupload"
+                      require="z3c.javascript.prototype">
+       <directory source="resources" include="upload.js swfobject.js"/>
      </resourceLibrary>
     </configure>
 
     <!-- ticket view -->
-
+    
     <browser:page
-     for=".interfaces.IUploadFileView"
-     name="ticket"
-     class=".ticket.TicketView"
-     permission="zope.ManageContent"
-    />
-
+        for=".interfaces.IUploadFileView"
+        name="ticket"
+        class=".ticket.TicketView"
+        permission="zope.ManageContent"
+        />
+    
     <browser:page
-     for=".interfaces.IFlashUploadForm"
-     name="flashuploadvars.xml"
-     template="flashuploadvars.pt"
-     permission="zope.Public"
-     />
-     
-     <i18n:registerTranslations directory="locales" />
+        for=".interfaces.IFlashUploadForm"
+        name="flashuploadvars.xml"
+        class=".upload.FlashUploadVars"
+        template="flashuploadvars.pt"
+        permission="zope.Public"
+        />
     
+    <i18n:registerTranslations directory="locales" />
+    
 </configure>

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/flashuploadvars.pt
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/flashuploadvars.pt	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/flashuploadvars.pt	2006-12-12 17:02:13 UTC (rev 71539)
@@ -6,4 +6,10 @@
     <var name="overall_progress" i18n:translate="">Overall Progress</var>
     <var name="error" i18n:translate="">Error on uploading files</var>
     <var name="uploadcomplete" i18n:translate="">all files uploaded</var>
+    <tal:block
+        tal:condition="view/allowedFileTypes"
+        tal:repeat="allowedType view/allowedFileTypes">
+      <var name="allowedFileType" tal:content="allowedType">jpg</var>
+    </tal:block>
+    
 </var>
\ No newline at end of file

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/resources/Upload.as
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/resources/Upload.as	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/resources/Upload.as	2006-12-12 17:02:13 UTC (rev 71539)
@@ -1 +1 @@
-/**
    Widget for uploading one or more Files to a Zope3 Server. 

    for autentication we need to get a ticket id befor sending the post request.
    
    step1: get the ticket:
    
    ./ticket.html/filename=myfile.jpg
    this returns us a target path:
    targeturl=http://...... 
    this is the target where we post the file
    
    step2: send file to the given url
    
    configuration:
    on _level0 we receive the information about where to get the ticket - inside
    the ticket we receive the url where to upload. 
    
    _level0.target_path -> where to get the ticket
    _level0.allowed_types -> space seperated files of allowed types. 
    
    _level0.allowed_types = "Images (all jpgs and pngs); jpg jpeg png gif|

    @author <manfred.schwendinger at lovelysystems.com>
*/


import flash.net.FileReferenceList;
import flash.net.FileReference;

class Upload extends MovieClip{
   
    
    private var info_mc:MovieClip;
        
    private var file_array:Array;
    private var fileref:FileReferenceList;
    private var file:FileReference; // currently active file for upload
    
    private var allowed_types:Array;
    private var debug_txt:TextField;
    
    private var upload_complete_str:String;
    
    private var load_vars:LoadVars;
    
    private var overall_total:Number;
    private var overall_loaded:Number;
    
    private var file_counter:Number;
    private var file_amount:Number;
	
	private var data_xml:XML;
    
	private var error_msg:String;
	
	private var js_command_queue:Array; // only one getURL can be called inside one frame. so lets make a queue to avoid troubles. 
	
    public function Upload(){
        

        
		js_command_queue = new Array();
        
		overall_total = 0;
        overall_loaded = 0;
        file_counter = 0;
        
		log("initialize. target: "+_level0.target_path);
    
        // allow upload from the local host
        System.security.allowDomain("http://localhost/");
        
        fileref = new FileReferenceList();
        fileref.addListener(this);
        
		// we do not want to have an overall info if there is only 1 file uploading...
		info_mc.overallinfo_mc._visible = false;
		
        info_mc.fileinfo_mc.progress_mc.bar_mc.gotoAndStop(1);
        info_mc.overallinfo_mc.progress_mc.bar_mc.gotoAndStop(1);
                
        info_mc._visible = false;

        this.onResize();
        Stage.addListener(this)
            
		var xml_url:String = _level0.base_path+"/@@flashuploadvars.xml";
		
		data_xml = new XML();
		data_xml["ptr"] = this;
		data_xml.ignoreWhite = true;
		data_xml.onLoad = function(){ this.ptr.parseDataXML(this); }
		data_xml.load(xml_url);
		log("vars url: "+xml_url);

        
    }

    private function onResize(){

        var margin:Number = 5;
        var width:Number = Stage.width - 2*margin;
        
		// position of the file info (current file name + number)
		info_mc.filename_txt._width = info_mc.filenum_txt._x - info_mc.filename_txt._x;
		info_mc.filenum_txt._x = width - info_mc.filenum_txt._width; 
		info_mc.progress_txt.text = "";
		info_mc.progress_txt._x = width - info_mc.progress_txt._width;
		
		// file progress positions
		this.setProgressSize(info_mc.fileinfo_mc, width);
		// overall progress positions
		this.setProgressSize(info_mc.overallinfo_mc, width);
    }
    
	/*
		sets the size of a bar line (overall and file bars)
	*/
	private function setProgressSize(mc:MovieClip, width:Number):Void{
		mc.label_txt._width = width - mc.progress_txt._width;
		mc.progress_txt._x = width - mc.progress_txt._width;
		mc.progress_mc._width = width;			
	}
	
	
	/**
		parses the language dependend strings. 
	*/
	private function parseDataXML(obj_xml:XML):Void{
		log("xml loaded: "+obj_xml.firstChild);
		var nodes = obj_xml.firstChild.childNodes;
		for (var i=0; i<nodes.length; i++){
			var nodeval:String = nodes[i].firstChild.nodeValue; 
			switch(nodes[i].attributes.name){
				case "file_progress" :
					info_mc.fileinfo_mc.label_txt.text = nodeval;
					break;
				case "overall_progress" :
					info_mc.overallinfo_mc.label_txt.text = nodeval;
					break;
				case "error" :
					error_msg = nodeval;
					break;
				case "uploadcomplete" :
				    upload_complete_str = nodeval;
                    break;
				default:
					log("error: unexpected attribute: "+nodes[i].attributes.name);
					break;
			}
		}
	}
	
	
    /**
        creates an array with all allowed types
        the data gets parsed from the variable of _level0.allowed_types
        
        var file:FileReference;

        var allTypes:Array = new Array();
        var imageTypes:Object = new Object();
        imageTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)";
        imageTypes.extension = "*.jpg; *.jpeg; *.gif; *.png";
        allTypes.push(imageTypes);

        var textTypes:Object = new Object();
        textTypes.description = "Text Files (*.txt, *.rtf)";
        textTypes.extension = "*.txt;*.rtf";
        allTypes.push(textTypes);
        
        arr = [{description:'a description', extension:'*.jpg'}, .....]
    */
    public function saveAllowedTypes(arr:Array):Void{
        allowed_types = arr;
    }
    
    /**
        starts the browsing process for uploading files
    */
    public function browse():Void{
		js_command_queue.push("javascript:z3cFlashUploadDisableBrowseButton()");

        if (allowed_types.length>0){
            fileref.browse(allowed_types);
        }
        else{
            fileref.browse();
        }
    }

    /**
        starts the upload queue
    */
    public function onSelect(fileRefList:FileReferenceList):Void{
        
		file_array = fileRefList.fileList;
		log("uploadFiles: "+file_array.length);        
        
		// overall progress should be visible on mutliple fileupload only. 
		info_mc.overallinfo_mc._visible = (file_array.length > 1);
		
        for (var i=0; i<file_array.length; i++){
            overall_total+=file_array[i].size;
        }
        
        if (file_array.length>0){
            info_mc._visible = true;
            file_counter = 0;
            file_amount = file_array.length;
            loadNextTicket();
        }
    }
    
    /**
        loads the next upload ticket via loadvars
        the ticket holds some security information which 
        are required for the upload
    */
    public function loadNextTicket():Void{

        // we want to have a 100% bar, even if onProgress was never
        // fired because the file was so small that onProgress was
        // never fired
        this.updateFileProgress(100);
        
        if (file_array.length == 0){
            log("all files uploaded.");
			// all files uploaded. Fire JavaScript Event
			js_command_queue.push("javascript:z3cFlashUploadOnUploadCompleteFEvent()");
			
			info_mc.filename_txt.text = upload_complete_str;
            this.updateOverallProgress(100);
            return;
        }
        
        load_vars = new LoadVars();
        load_vars["ptr"] = this;
        load_vars.onData = function(d:String){
            this["ptr"].log("load data: "+d);
            this["ptr"].loadNextFile(d);
        }
        load_vars.load(_level0.target_path+"/@@ticket");
    }
    
	
    /**
        loads the next file inside the file_array
    */
    public function loadNextFile(ticket:String):Void{        
        file = FileReference(file_array.pop());
        
        var url:String = _level0.target_path+"?ticket="+ticket;
        
        log("uploadNextFile: "+url);
        
        file.addListener(this);
        file.upload(url);
    }
    
	
    public function log(msg:String):Void{
        trace(msg);
		
		if (msg.length>500) msg = msg.substring(msg.length-100, msg.length);
		
        _level0.debug_txt.text+=msg+"\n";
		_level0.debug_txt.scroll = _level0.debug_mc.debug_txt.maxscroll;
    }
    
	
	
    /**
        FileReference Listeners....
    */
    public function onProgress(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void{
        
		var percent:Number = Math.round(bytesLoaded/bytesTotal * 100);
		if (percent>100) percent=100; // for any strange reason, the totalbytes can be smaller then the loade bytes :)
        log("onProgress " + bytesLoaded + " bytesTotal: " + bytesTotal+" = "+percent+"%");

        this.updateFileProgress(percent);
       
        var percent_complete:Number = Math.round((overall_loaded+bytesLoaded) / overall_total * 100);

        // hack for waiting time after last upload is done
        // 100% should only be displayed when the LAST object fired his READY event. 
        if (percent_complete > 95) percent_complete = 95; 
		this.updateOverallProgress(percent_complete);
        
		info_mc.progress_txt.text = getByteString(overall_loaded + bytesLoaded) + "/" + getByteString(overall_total);
    }

    public function updateFileProgress(percent:Number):Void{
        if (percent>100) percent = 100;
        info_mc.fileinfo_mc.progress_mc.bar_mc.gotoAndStop(percent);
        info_mc.fileinfo_mc.progress_txt.text = percent+"%";
    }
    
    public function updateOverallProgress(percent:Number):Void{
        if (percent>100) percent = 100;
        info_mc.overallinfo_mc.progress_mc.bar_mc.gotoAndStop(percent);
        info_mc.overallinfo_mc.progress_txt.text = percent+"%";
    }
    
	/**
		returns a nice prepared string
	*/
	public function getByteString(bytes:Number):String{
		if (bytes<1024){
			// bytes
			return String(Math.round(bytes)+"B");
		}
		else if (bytes>(1024*1024)){
			// MB
			return String(Math.round(bytes/(1024*1024))+"MB");
		}
		else{
			// KB
			return String(Math.round(bytes/1024)+"KB");
		}
	}
	
    public function onComplete(file:FileReference):Void{
        log("file upload complete");
        
        overall_loaded+=file.size;
        this.loadNextTicket();
		
		// tell javascript that the file is uploaded. 
		js_command_queue.push("javascript:z3cFlashUploadOnFileCompleteFEvent('"+file.name+"')");
    }

    public function onCancel(file:FileReference):Void{
        log("onCancel");
		js_command_queue.push("javascript:z3cFlashUploadOnCancelFEvent()");
    }
    
    public function onOpen(file:FileReference):Void{
        log("onOpen: "+file.name+" : "+file.size);
        file_counter++;
        
        info_mc.filename_txt.text = file.name +" ("+Math.round(file.size/1024)+"kb)";
        info_mc.filenum_txt.text = file_counter+"/"+file_amount;
    }

    public function onHTTPError(file:FileReference):Void {
        log("onHTTPError: " + file.name);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");
    }

    public function onIOError(file:FileReference):Void {
        log("onIOError: " + file.name);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");		
    }
    
    public function onSecurityError(file:FileReference, errorString:String):Void {
        log("onSecurityError: " + file.name + " errorString: " + errorString);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");		
    }

    public function onEnterFrame():Void{
        if (_level0.startBrowse=="go"){
			log("go event was fired");
            _level0.startBrowse = "";
            this.browse();
        }
		
		if (js_command_queue.length>0){
			var command = js_command_queue.shift();
			getURL(command);
		}
		
    }
	
}
\ No newline at end of file
+/**
    Widget for uploading one or more Files to a Zope3 Server. 

    for autentication we need to get a ticket id befor sending the post request.
    
    step1: get the ticket:
    
    ./ticket.html/filename=myfile.jpg
    this returns us a target path:
    targeturl=http://...... 
    this is the target where we post the file
    
    step2: send file to the given url
    
    configuration:
    on _level0 we receive the information about where to get the ticket - inside
    the ticket we receive the url where to upload. 
    
    _level0.target_path -> where to get the ticket
    _level0.allowed_types -> space seperated files of allowed types. 
    
    _level0.allowed_types = "Images (all jpgs and pngs); jpg jpeg png gif|

    @author <manfred.schwendinger at lovelysystems.com>
*/


import flash.net.FileReferenceList;
import flash.net.FileReference;

class Upload extends MovieClip{
   
    
    private var info_mc:MovieClip;
        
    private var file_array:Array;
    private var fileref:FileReferenceList;
    private var file:FileReference; // currently active file for upload
    
    private var allowed_types:Array;
    private var debug_txt:TextField;
    
    private var upload_complete_str:String;
    
    private var load_vars:LoadVars;
    
    private var overall_total:Number;
    private var overall_loaded:Number;
    
    private var file_counter:Number;
    private var file_amount:Number;
	
	private var data_xml:XML;
    
	private var error_msg:String;
	
	private var js_command_queue:Array; // only one getURL can be called inside one frame. so lets make a queue to avoid troubles. 
	
    public function Upload(){
        

        
		js_command_queue = new Array();
        
		overall_total = 0;
        overall_loaded = 0;
        file_counter = 0;
        
		log("initialize. target: "+_level0.target_path);
    
        // allow upload from the local host
        System.security.allowDomain("http://localhost/");
        
        fileref = new FileReferenceList();
        fileref.addListener(this);
        
		// we do not want to have an overall info if there is only 1 file uploading...
		info_mc.overallinfo_mc._visible = false;
		
        info_mc.fileinfo_mc.progress_mc.bar_mc.gotoAndStop(1);
        info_mc.overallinfo_mc.progress_mc.bar_mc.gotoAndStop(1);
                
        info_mc._visible = false;

        this.onResize();
        Stage.addListener(this)
            
		var xml_url:String = _level0.base_path+"/@@flashuploadvars.xml";
		
		data_xml = new XML();
		data_xml["ptr"] = this;
		data_xml.ignoreWhite = true;
		data_xml.onLoad = function(){ this.ptr.parseDataXML(this); }
		data_xml.load(xml_url);
		log("vars url: "+xml_url);

        
    }

    private function onResize(){

        var margin:Number = 5;
        var width:Number = Stage.width - 2*margin;
        
		// position of the file info (current file name + number)
		info_mc.filename_txt._width = info_mc.filenum_txt._x - info_mc.filename_txt._x;
		info_mc.filenum_txt._x = width - info_mc.filenum_txt._width; 
		info_mc.progress_txt.text = "";
		info_mc.progress_txt._x = width - info_mc.progress_txt._width;
		
		// file progress positions
		this.setProgressSize(info_mc.fileinfo_mc, width);
		// overall progress positions
		this.setProgressSize(info_mc.overallinfo_mc, width);
    }
    
	/*
		sets the size of a bar line (overall and file bars)
	*/
	private function setProgressSize(mc:MovieClip, width:Number):Void{
		mc.label_txt._width = width - mc.progress_txt._width;
		mc.progress_txt._x = width - mc.progress_txt._width;
		mc.progress_mc._width = width;			
	}
	
	
	/**
		parses the language dependend strings. 
	*/
	private function parseDataXML(obj_xml:XML):Void{
		log("xml loaded: "+obj_xml.firstChild);
		var nodes = obj_xml.firstChild.childNodes;
		for (var i=0; i<nodes.length; i++){
			var nodeval:String = nodes[i].firstChild.nodeValue; 
			switch(nodes[i].attributes.name){
				case "file_progress" :
					info_mc.fileinfo_mc.label_txt.text = nodeval;
					break;
				case "overall_progress" :
					info_mc.overallinfo_mc.label_txt.text = nodeval;
					break;
				case "error" :
					error_msg = nodeval;
					break;
				case "uploadcomplete" :
				    upload_complete_str = nodeval;
                    break;
                case "allowedFileType":
                    var allowedType = nodeval;
                    if (allowedType.chatAt(0) == ".") allowedType = "*"+allowedType;
                    if (allowed_types.length < 0) allowed_types = new Array();
                    allowed_types.push(allowedType);
                    break;
				default:
					log("error: unexpected attribute: "+nodes[i].attributes.name);
					break;
			}
		}
	}
	
	
    /**
        creates an array with all allowed types
        the data gets parsed from the variable of _level0.allowed_types
        
        var file:FileReference;

        var allTypes:Array = new Array();
        var imageTypes:Object = new Object();
        imageTypes.description = "Images (*.jpg, *.jpeg, *.gif, *.png)";
        imageTypes.extension = "*.jpg; *.jpeg; *.gif; *.png";
        allTypes.push(imageTypes);

        var textTypes:Object = new Object();
        textTypes.description = "Text Files (*.txt, *.rtf)";
        textTypes.extension = "*.txt;*.rtf";
        allTypes.push(textTypes);
        
        arr = [{description:'a description', extension:'*.jpg'}, .....]
    */
    public function saveAllowedTypes(arr:Array):Void{
        allowed_types = arr;
    }
    
    /**
        starts the browsing process for uploading files
    */
    public function browse():Void{
		js_command_queue.push("javascript:z3cFlashUploadDisableBrowseButton()");

        if (allowed_types.length>0){
            fileref.browse(allowed_types);
        }
        else{
            fileref.browse();
        }
    }

    /**
        starts the upload queue
    */
    public function onSelect(fileRefList:FileReferenceList):Void{
        
		file_array = fileRefList.fileList;
		log("uploadFiles: "+file_array.length);        
        
		// overall progress should be visible on mutliple fileupload only. 
		info_mc.overallinfo_mc._visible = (file_array.length > 1);
		
        for (var i=0; i<file_array.length; i++){
            overall_total+=file_array[i].size;
        }
        
        if (file_array.length>0){
            info_mc._visible = true;
            file_counter = 0;
            file_amount = file_array.length;
            loadNextTicket();
        }
    }
    
    /**
        loads the next upload ticket via loadvars
        the ticket holds some security information which 
        are required for the upload
    */
    public function loadNextTicket():Void{

        // we want to have a 100% bar, even if onProgress was never
        // fired because the file was so small that onProgress was
        // never fired
        this.updateFileProgress(100);
        
        if (file_array.length == 0){
            log("all files uploaded.");
			// all files uploaded. Fire JavaScript Event
			js_command_queue.push("javascript:z3cFlashUploadOnUploadCompleteFEvent()");
			
			info_mc.filename_txt.text = upload_complete_str;
            this.updateOverallProgress(100);
            return;
        }
        
        load_vars = new LoadVars();
        load_vars["ptr"] = this;
        load_vars.onData = function(d:String){
            this["ptr"].log("load data: "+d);
            this["ptr"].loadNextFile(d);
        }
        load_vars.load(_level0.target_path+"/@@ticket");
    }
    
	
    /**
        loads the next file inside the file_array
    */
    public function loadNextFile(ticket:String):Void{        
        file = FileReference(file_array.pop());
        
        var url:String = _level0.target_path+"?ticket="+ticket;
        
        log("uploadNextFile: "+url);
        
        file.addListener(this);
        file.upload(url);
    }
    
	
    public function log(msg:String):Void{
        trace(msg);
		
		if (msg.length>500) msg = msg.substring(msg.length-100, msg.length);
		
        _level0.debug_txt.text+=msg+"\n";
		_level0.debug_txt.scroll = _level0.debug_mc.debug_txt.maxscroll;
    }
    
	
	
    /**
        FileReference Listeners....
    */
    public function onProgress(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void{
        
		var percent:Number = Math.round(bytesLoaded/bytesTotal * 100);
		if (percent>100) percent=100; // for any strange reason, the totalbytes can be smaller then the loade bytes :)
        log("onProgress " + bytesLoaded + " bytesTotal: " + bytesTotal+" = "+percent+"%");

        this.updateFileProgress(percent);
       
        var percent_complete:Number = Math.round((overall_loaded+bytesLoaded) / overall_total * 100);

        // hack for waiting time after last upload is done
        // 100% should only be displayed when the LAST object fired his READY event. 
        if (percent_complete > 95) percent_complete = 95; 
		this.updateOverallProgress(percent_complete);
        
		info_mc.progress_txt.text = getByteString(overall_loaded + bytesLoaded) + "/" + getByteString(overall_total);
    }

    public function updateFileProgress(percent:Number):Void{
        if (percent>100) percent = 100;
        info_mc.fileinfo_mc.progress_mc.bar_mc.gotoAndStop(percent);
        info_mc.fileinfo_mc.progress_txt.text = percent+"%";
    }
    
    public function updateOverallProgress(percent:Number):Void{
        if (percent>100) percent = 100;
        info_mc.overallinfo_mc.progress_mc.bar_mc.gotoAndStop(percent);
        info_mc.overallinfo_mc.progress_txt.text = percent+"%";
    }
    
	/**
		returns a nice prepared string
	*/
	public function getByteString(bytes:Number):String{
		if (bytes<1024){
			// bytes
			return String(Math.round(bytes)+"B");
		}
		else if (bytes>(1024*1024)){
			// MB
			return String(Math.round(bytes/(1024*1024))+"MB");
		}
		else{
			// KB
			return String(Math.round(bytes/1024)+"KB");
		}
	}
	
    public function onComplete(file:FileReference):Void{
        log("file upload complete");
        
        overall_loaded+=file.size;
        this.loadNextTicket();
		
		// tell javascript that the file is uploaded. 
		js_command_queue.push("javascript:z3cFlashUploadOnFileCompleteFEvent('"+file.name+"')");
    }

    public function onCancel(file:FileReference):Void{
        log("onCancel");
		js_command_queue.push("javascript:z3cFlashUploadOnCancelFEvent()");
    }
    
    public function onOpen(file:FileReference):Void{
        log("onOpen: "+file.name+" : "+file.size);
        file_counter++;
        
        info_mc.filename_txt.text = file.name +" ("+Math.round(file.size/1024)+"kb)";
        info_mc.filenum_txt.text = file_counter+"/"+file_amount;
    }

    public function onHTTPError(file:FileReference):Void {
        log("onHTTPError: " + file.name);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");
    }

    public function onIOError(file:FileReference):Void {
        log("onIOError: " + file.name);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");		
    }
    
    public function onSecurityError(file:FileReference, errorString:String):Void {
        log("onSecurityError: " + file.name + " errorString: " + errorString);
		js_command_queue.push("javascript:z3cFlashUploadOnErrorFEvent('"+this.error_msg+"')");		
    }

    public function onEnterFrame():Void{
        if (_level0.startBrowse=="go"){
			log("go event was fired");
            _level0.startBrowse = "";
            this.browse();
        }
		
		if (js_command_queue.length>0){
			var command = js_command_queue.shift();
			getURL(command);
		}
		
    }
	
}
\ No newline at end of file

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/resources/upload.swf
===================================================================
(Binary files differ)

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/tests.py
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/tests.py	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/tests.py	2006-12-12 17:02:13 UTC (rev 71539)
@@ -1,6 +1,6 @@
 import doctest
 import unittest
-from zope.testing.doctestunit import DocTestSuite
+from zope.testing.doctestunit import DocTestSuite, DocFileSuite
 from zope.app.testing import setup
 
 def setUp(test):
@@ -17,6 +17,11 @@
                      setUp=setUp,tearDown=tearDown,
                      optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
                      ),
+        DocFileSuite('README.txt',
+                     setUp=setUp,tearDown=tearDown,
+                     optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+                     ),
+
         ))
 
 if __name__ == '__main__':

Modified: z3c.widget/trunk/src/z3c/widget/flashupload/upload.py
===================================================================
--- z3c.widget/trunk/src/z3c/widget/flashupload/upload.py	2006-12-12 15:35:50 UTC (rev 71538)
+++ z3c.widget/trunk/src/z3c/widget/flashupload/upload.py	2006-12-12 17:02:13 UTC (rev 71539)
@@ -10,6 +10,7 @@
 from zope.app.pagetemplate import ViewPageTemplateFile
 from zope.app.container.constraints import checkObject
 from zope import event
+
 from i18n import _
 
 from z3c.widget.flashupload.interfaces import IFlashUploadForm, IUploadFileView, FlashUploadedEvent
@@ -22,6 +23,14 @@
     haveResourceLibrary = False
 
 
+class FlashUploadVars(BrowserView):
+    """simple view for the flashupload.pt
+    to configure the flash upload swf"""
+
+    allowedFileTypes = () # empty tuple for all file types
+    
+    
+
 class UploadFile(object):
     """handles file upload for the flash client.
     flash client sends the data via post as u'Filedata'



More information about the Checkins mailing list