summaryrefslogtreecommitdiff
path: root/lib/_fla
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2008-06-07 00:28:49 +0200
committerAndreas Gohr <andi@splitbrain.org>2008-06-07 00:28:49 +0200
commitd00ec4555f81210cd067f98d9bc7cef51f456462 (patch)
treeb9e42451c57ff91dadd2423bb550603de6f52ef8 /lib/_fla
parent09c2d803ca738992288c138eab41f35008e3e3df (diff)
downloadrpg-d00ec4555f81210cd067f98d9bc7cef51f456462.tar.gz
rpg-d00ec4555f81210cd067f98d9bc7cef51f456462.tar.bz2
experimental Flash based multi upload
This patch adds experimental support for uploading multiple files in one go. This is achieved by using Flash for selecting multiple images and intitiating the HTTP upload. When Flash 8 or higher is detected, an additional icon is added to the usual upload form. Clicking it will swith the form to the Flash based upload queue. Things that need work: * Better Icon * Feedback if Flash detection works on all Flash 8 supported platforms * Progress feedback seems not to work on Linux (might be Adobe bug) * No final feedback how many images were uploaded correctly The flash sources are located in lib/_fla/ Any feedback and help would be appreciated. darcs-hash:20080606222849-7ad00-738083445af275752aaebc29bfa51430f3d94459.gz
Diffstat (limited to 'lib/_fla')
-rw-r--r--lib/_fla/.htaccess3
-rw-r--r--lib/_fla/MultipleUpload.as274
-rw-r--r--lib/_fla/README1
-rw-r--r--lib/_fla/multipleUpload.flabin0 -> 1812992 bytes
4 files changed, 278 insertions, 0 deletions
diff --git a/lib/_fla/.htaccess b/lib/_fla/.htaccess
new file mode 100644
index 000000000..9a7d38c12
--- /dev/null
+++ b/lib/_fla/.htaccess
@@ -0,0 +1,3 @@
+## no access to the fla directory
+order allow,deny
+deny from all
diff --git a/lib/_fla/MultipleUpload.as b/lib/_fla/MultipleUpload.as
new file mode 100644
index 000000000..8e7e0b008
--- /dev/null
+++ b/lib/_fla/MultipleUpload.as
@@ -0,0 +1,274 @@
+/**
+ * Flash Multi Upload
+ *
+ * Based on a example from Alastair Dawson
+ *
+ * @link http://blog.vixiom.com/2006/09/08/multiple-file-upload-with-flash-and-ruby-on-rails/
+ * @author Alastair Dawson
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+
+// delegate
+import mx.utils.Delegate;
+// ui components
+import mx.controls.DataGrid;
+import mx.controls.gridclasses.DataGridColumn
+import mx.controls.Button;
+import mx.controls.TextInput;
+import mx.controls.CheckBox;
+import mx.controls.Label;
+// file reference
+import flash.net.FileReferenceList;
+import flash.net.FileReference;
+
+class MultipleUpload {
+
+ private var fileRef:FileReferenceList;
+ private var fileRefListener:Object;
+ private var list:Array;
+ private var dp:Array;
+
+ private var files_dg:DataGrid;
+ private var browse_btn:Button;
+ private var upload_btn:Button;
+ private var ns_input:TextInput;
+ private var ns_label:Label;
+ private var overwrite_cb:CheckBox;
+
+ /**
+ * Constructor.
+ *
+ * Initializes the needed objects and stage objects
+ */
+ public function MultipleUpload(fdg:DataGrid, bb:Button, ub:Button, nsi:TextInput, nsl:Label, ob:CheckBox) {
+ // references for objects on the stage
+ files_dg = fdg;
+ browse_btn = bb;
+ upload_btn = ub;
+ ns_input = nsi;
+ ns_label = nsl;
+ overwrite_cb = ob;
+
+ // file list references & listener
+ fileRef = new FileReferenceList();
+ fileRefListener = new Object();
+ fileRef.addListener(fileRefListener);
+
+ // setup
+ iniUI();
+ inifileRefListener();
+ }
+
+ /**
+ * Initializes the User Interface
+ *
+ * Uses flashvars to access possibly localized names
+ */
+ private function iniUI() {
+ // register button handlers
+ browse_btn.onRelease = Delegate.create(this, this.browse);
+ upload_btn.onRelease = Delegate.create(this, this.upload);
+
+ // columns for dataGrid
+ var col:DataGridColumn;
+ col = new DataGridColumn('name');
+ col.headerText = ( _root.L_gridname ? _root.L_gridname : 'Filename' );
+ col.sortable = false;
+ files_dg.addColumn(col);
+ col = new DataGridColumn('size');
+ col.headerText = ( _root.L_gridsize ? _root.L_gridsize : 'Size' );
+ col.sortable = false;
+ files_dg.addColumn(col);
+ col = new DataGridColumn('status');
+ col.headerText = ( _root.L_gridstat ? _root.L_gridstat : 'Status' );
+ col.sortable = false;
+ files_dg.addColumn(col);
+
+ // label translations
+ if(_root.L_overwrite) overwrite_cb.label = _root.L_overwrite;
+ if(_root.L_browse) browse_btn.label = _root.L_browse;
+ if(_root.L_upload) upload_btn.label = _root.L_upload;
+ if(_root.L_namespace) ns_label.text = _root.L_namespace;
+
+ // prefill input field
+ if(_root.O_ns) ns_input.text = _root.O_ns;
+
+ // disable buttons
+ upload_btn.enabled = false;
+ if(!_root.O_overwrite) overwrite_cb.visible = false;
+
+ // initalize the data provider list
+ dp = new Array();
+ list = new Array();
+ files_dg.spaceColumnsEqually();
+ }
+
+ /**
+ * Open files selection dialog
+ *
+ * Adds the allowed file types
+ */
+ private function browse() {
+ if(_root.O_extensions){
+ var exts:Array = _root.O_extensions.split('|');
+ var filter:Object = new Object();
+ filter.description = (_root.L_filetypes ? _root.L_filetypes : 'Allowed filetypes');
+ filter.extension = '';
+ for(var i:Number = 0; i<exts.length; i++){
+ filter.extension += '*.'+exts[i]+';';
+ }
+ filter.extension = filter.extension.substr(0,filter.extension.length-1);
+ var apply:Array = new Array();
+ apply.push(filter);
+ fileRef.browse(apply);
+ }else{
+ fileRef.browse();
+ }
+ }
+
+ /**
+ * Upload selected files
+ */
+ private function upload() {
+ // prepare backend URL
+ var url:String;
+ url = _root.O_backend; // from flashvars
+ url += '&ns='+escape(ns_input.text);
+
+ // prepare upload url
+ var upurl:String;
+ upurl = url;
+ upurl += '&sectok='+escape(_root.O_sectok);
+ upurl += '&authtok='+escape(_root.O_authtok);
+ if(overwrite_cb.selected) upurl += '&ow=1';
+
+ // disable buttons
+ upload_btn.enabled = false;
+ browse_btn.enabled = false;
+ ns_input.enabled = false;
+ overwrite_cb.enabled = false;
+
+ // upload the files
+ for(var i:Number = 0; i < list.length; i++) {
+ var file = list[i];
+ file.addListener(fileRefListener);
+ file.upload(upurl);
+ }
+
+ // when done redirect
+ getURL(url,'_self');
+ }
+
+ /**
+ * Set the status of a given file in the data grid
+ */
+ private function setStatus(file,msg){
+ for(var i:Number = 0; i < list.length; i++) {
+ if (list[i].name == file.name) {
+ files_dg.editField(i, 'status', msg);
+ }
+ }
+ }
+
+ /**
+ * Initialize the file reference listener
+ */
+ private function inifileRefListener() {
+ fileRefListener.onSelect = Delegate.create(this, this.onSelect);
+ fileRefListener.onCancel = Delegate.create(this, this.onCancel);
+ fileRefListener.onOpen = Delegate.create(this, this.onOpen);
+ fileRefListener.onProgress = Delegate.create(this, this.onProgress);
+ fileRefListener.onComplete = Delegate.create(this, this.onComplete);
+ fileRefListener.onHTTPError = Delegate.create(this, this.onHTTPError);
+ fileRefListener.onIOError = Delegate.create(this, this.onIOError);
+ fileRefListener.onSecurityError = Delegate.create(this, this.onSecurityError);
+ }
+
+ /**
+ * Handle file selection
+ *
+ * Files are added as in a list of references and beautified into the data grid dataprovider array
+ *
+ * Multiple browses will add to the list
+ */
+ private function onSelect(fileRefList:FileReferenceList) {
+ var sel = fileRefList.fileList;
+ for(var i:Number = 0; i < sel.length; i++) {
+ // check size
+ var stat:String;
+ if(_root.O_maxsize && sel[i].size > _root.O_maxsize){
+ stat = (_root.L_toobig ? _root.L_toobig : 'too big');
+ }else{
+ stat = (_root.L_ready ? _root.L_ready : 'ready for upload');
+ }
+ // add to grid
+ dp.push({name:sel[i].name, size:Math.round(sel[i].size / 1000) + " kb", status:stat});
+ // add to reference list
+ list.push(sel[i]);
+ }
+ // update dataGrid
+ files_dg.dataProvider = dp;
+ files_dg.spaceColumnsEqually();
+
+ if(list.length > 0) upload_btn.enabled = true;
+ }
+
+ /**
+ * Does nothing
+ */
+ private function onCancel() {
+ }
+
+ /**
+ * Does nothing
+ */
+ private function onOpen(file:FileReference) {
+ }
+
+ /**
+ * Set the upload progress
+ */
+ private function onProgress(file:FileReference, bytesLoaded:Number, bytesTotal:Number) {
+ var percentDone = Math.round((bytesLoaded / bytesTotal) * 100);
+ var msg:String = 'uploading @PCT@%';
+ if(_root.L_progress) msg = _root.L_progress;
+ msg = msg.split('@PCT@').join(percentDone);
+ this.setStatus(file,msg);
+ }
+
+ /**
+ * Handle upload completion
+ */
+ private function onComplete(file:FileReference) {
+ this.setStatus(file,(_root.L_done ? _root.L_done : 'complete'));
+ }
+
+ /**
+ * Handle upload errors
+ */
+ private function onHTTPError(file:FileReference, httpError:Number) {
+ if(httpError == 400){
+ this.setStatus(file,(_root.L_fail ? _root.L_fail : 'failed'));
+ }else if(httpError == 401){
+ this.setStatus(file,(_root.L_authfail ? _root.L_authfail : 'auth failed'));
+ }else{
+ this.setStatus(file,"HTTP Error " + httpError);
+ }
+ }
+
+ /**
+ * Handle IO errors
+ */
+ private function onIOError(file:FileReference) {
+ this.setStatus(file,"IO Error");
+ }
+
+ /**
+ * Handle Security errors
+ */
+ private function onSecurityError(file:FileReference, errorString:String) {
+ this.setStatus(file,"SecurityError: " + errorString);
+ }
+
+
+}
diff --git a/lib/_fla/README b/lib/_fla/README
new file mode 100644
index 000000000..beaa15d02
--- /dev/null
+++ b/lib/_fla/README
@@ -0,0 +1 @@
+Flash source files. Those will not be included in the tarball releases.
diff --git a/lib/_fla/multipleUpload.fla b/lib/_fla/multipleUpload.fla
new file mode 100644
index 000000000..a04237c1c
--- /dev/null
+++ b/lib/_fla/multipleUpload.fla
Binary files differ