Permalink
Browse files

Fixed Flash Player 10.1 issue where FileReferences could not be sent …

…via ExternalInterface
  • Loading branch information...
1 parent 1f36464 commit a51d9cbd06e968c7a5646d4b36ed7beb7f5a8718 Nathan Colgate committed Aug 28, 2010
View
22 CHANGELOG
@@ -0,0 +1,22 @@
+v0.3.0
+
+* 2010-08-27
+* Flash Player 10.1 did not allow ExternalInterface to pass a FileReference object to Javascript
+ So I added a toJavascript function that converts FileReference into simple Objects with only three attributes:
+ - name
+ - size
+ - type
+
+* Also, S3Queue now has it's own toJavascript function. The queue that gets passed through to the Javascript now
+ has a much more meaningful attribute of 'files' instead of 'source'
+
+v0.2.0
+
+* 2010-05-27
+* The flex application in this fork was completely re-written so that there are no flash or flex UI components.
+ The one exception to that is the browse button, which, for security purposes MUST be flash.
+ But even then, you get to pass the URLs for images to use for that button!
+
+v0.1.0
+
+* Created by people way smarter than I
View
2 Manifest
@@ -1,7 +1,9 @@
+CHANGELOG
MIT-LICENSE
Manifest
README.textile
Rakefile
+flex_src/bin-release/flex-config.xml
flex_src/compile
flex_src/src/Globals.as
flex_src/src/S3Uploader.as
View
16 Rakefile
@@ -1,14 +1,14 @@
require 'rubygems'
require 'rake'
-require 'rake/testtask'
require 'echoe'
-Echoe.new('s3_swf_upload', '0.2.0') do |p|
- p.description = "Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior."
- p.url = "http://github.com/nathancolgate/s3-swf-upload-plugin"
- p.author = "Nathan Colgate"
- p.email = "nathan@brandnewbox.com"
- p.ignore_pattern = FileList[".gitignore"]
- p.development_dependencies = []
+Echoe.new("s3_swf_upload") do |p|
+p.author = "Nathan Colgate"
+p.email = "nathan@brandnewbox.com"
+p.description = "Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior."
+p.url = "http://github.com/nathancolgate/s3-swf-upload-plugin"
+p.version = '0.3.0'
+p.development_dependencies = []
+p.ignore_pattern = [".gitignore"]
end
View
53 flex_src/src/S3Uploader.as
@@ -1,7 +1,7 @@
package {
import flash.events.*;
- import flash.external.ExternalInterface;
+ import flash.external.*;
import flash.net.*;
import flash.display.Sprite;
import flash.system.Security;
@@ -49,6 +49,7 @@ package {
buttonDownUrl:String,
buttonOverUrl:String
):void {
+ // ExternalInterface.call('s3_swf.jsLog','Initializing...');
flash.system.Security.allowDomain("*");
@@ -81,53 +82,75 @@ package {
Globals.queue = this.queue;
ExternalInterface.addCallback("removeFileFromQueue", removeFileHandler);
+ // ExternalInterface.call('s3_swf.jsLog','Initialized');
}
// called when the browse button is clicked
// Browse for files
private function clickHandler(event:Event):void{
+ // ExternalInterface.call('s3_swf.jsLog','clickHandler');
if(_selectMultipleFiles == true){
+ // ExternalInterface.call('s3_swf.jsLog','Opening Multiple File Dialog box...');
_multipleFileDialogBox.browse([_fileFilter]);
+ // ExternalInterface.call('s3_swf.jsLog','Multiple File Dialog box Opened');
} else {
+ // ExternalInterface.call('s3_swf.jsLog','Opening Single File Dialog box...');
_singleFileDialogBox.browse([_fileFilter]);
+ // ExternalInterface.call('s3_swf.jsLog','Single File Dialog box Opened');
}
}
// called after user selected files form the browse dialouge box.
private function selectFileHandler(event:Event):void {
+ // ExternalInterface.call('s3_swf.jsLog','selectFileHandler');
var remainingSpots:int = _queueSizeLimit - this.queue.length;
var tooMany:Boolean = false;
if(_selectMultipleFiles == true){
- // Add multiple files to the queue array
+ // Adding multiple files to the queue array
+ // ExternalInterface.call('s3_swf.jsLog','Adding multiple files to the queue array...');
if(event.currentTarget.fileList.length > remainingSpots) { tooMany = true; }
var i:int;
for (i=0;i < remainingSpots; i ++){
- addFile(event.currentTarget.fileList[i]);
+ // ExternalInterface.call('s3_swf.jsLog','Adding '+(i+1)+' of '+(remainingSpots)+' files to the queue array...');
+ addFile(event.currentTarget.fileList[i]);
+ // ExternalInterface.call('s3_swf.jsLog',(i+1)+' of '+(remainingSpots)+' files added to the queue array');
}
+ // ExternalInterface.call('s3_swf.jsLog','Multiple files added to the queue array');
} else {
- // Add one single files to the queue array
+ // Adding one single file to the queue array
+ // ExternalInterface.call('s3_swf.jsLog','Adding single file to the queue array...');
if(remainingSpots > 0) {
addFile(FileReference(event.target));
} else {
tooMany = true;
}
+ // ExternalInterface.call('s3_swf.jsLog','Single file added to the queue array');
}
if(tooMany == true) {
- ExternalInterface.call('s3_swf.onQueueSizeLimitReached',this.queue);
+ // ExternalInterface.call('s3_swf.jsLog','Calling onQueueSizeLimitReached...');
+ ExternalInterface.call('s3_swf.onQueueSizeLimitReached',this.queue.toJavascript());
+ // ExternalInterface.call('s3_swf.jsLog','onQueueSizeLimitReached called');
}
}
// Add Selected File to Queue from file browser dialog box
private function addFile(file:FileReference):void{
+ // ExternalInterface.call('s3_swf.jsLog','addFile');
if (checkFileSize(file.size)){
+ // ExternalInterface.call('s3_swf.jsLog','Adding file to queue...');
this.queue.addItem(file);
- ExternalInterface.call('s3_swf.onFileAdd',file);
+ // ExternalInterface.call('s3_swf.jsLog','File added to queue');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onFileAdd...');
+ ExternalInterface.call('s3_swf.onFileAdd',toJavascript(file));
+ // ExternalInterface.call('s3_swf.jsLog','onFileAdd called');
} else {
- ExternalInterface.call('s3_swf.onFileSizeLimitReached',file);
+ // ExternalInterface.call('s3_swf.jsLog','Calling onFileSizeLimitReached...');
+ ExternalInterface.call('s3_swf.onFileSizeLimitReached',toJavascript(file));
+ // ExternalInterface.call('s3_swf.jsLog','onFileSizeLimitReached called');
}
}
@@ -137,9 +160,13 @@ package {
try {
var del_file:FileReference = FileReference(this.queue.getItemAt(index));
this.queue.removeItemAt(index);
+ // ExternalInterface.call('s3_swf.jsLog','Calling onFileRemove...');
ExternalInterface.call('s3_swf.onFileRemove',del_file);
- } catch(e:Error) {
+ // ExternalInterface.call('s3_swf.jsLog','onFileRemove called');
+ } catch(e:Error) {
+ // ExternalInterface.call('s3_swf.jsLog','Calling onFileNotInQueue...');
ExternalInterface.call('s3_swf.onFileNotInQueue');
+ // ExternalInterface.call('s3_swf.jsLog','onFileNotInQueue called');
}
}
@@ -160,5 +187,15 @@ package {
}
return r;
}
+
+ // Turns a FileReference into an Object so that ExternalInterface doesn't choke
+ private function toJavascript(file:FileReference):Object{
+ var javascriptable_file:Object = new Object();
+ javascriptable_file.name = file.name;
+ javascriptable_file.size = file.size;
+ javascriptable_file.type = file.type;
+ return javascriptable_file;
+ }
+
}
}
View
50 flex_src/src/com/nathancolgate/s3_swf_upload/S3Queue.as
@@ -29,42 +29,84 @@ package com.nathancolgate.s3_swf_upload {
}
public function uploadNextFile():void{
+ // ExternalInterface.call('s3_swf.jsLog','uploadNextFile');
+ // ExternalInterface.call('s3_swf.jsLog','Start uploadNextFile...');
var next_file:FileReference = FileReference(this.getItemAt(0));
var signature:S3Signature = new S3Signature(next_file,_signatureUrl,_prefixPath);
+ // ExternalInterface.call('s3_swf.jsLog','End uploadNextFile');
}
// whenever the queue changes this function is called
private function changeHandler(event:CollectionEvent):void{
- ExternalInterface.call('s3_swf.onQueueChange',this);
+ // ExternalInterface.call('s3_swf.jsLog','changeHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onQueueChange...');
+ ExternalInterface.call('s3_swf.onQueueChange',this.toJavascript());
+ // ExternalInterface.call('s3_swf.jsLog','onQueueChange called');
}
// Remove all files from the upload queue;
private function clearHandler():void{
+ // ExternalInterface.call('s3_swf.jsLog','clearHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Removing All...');
this.removeAll();
- ExternalInterface.call('s3_swf.onQueueClear',this);
+ // ExternalInterface.call('s3_swf.jsLog','All removed');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onQueueClear...');
+ ExternalInterface.call('s3_swf.onQueueClear',this.toJavascript());
+ // ExternalInterface.call('s3_swf.jsLog','onQueueClear called');
}
// Start uploading the files from the queue
private function startUploadingHandler():void{
+ // ExternalInterface.call('s3_swf.jsLog','startUploadingHandler');
if (this.length > 0){
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadingStart...');
ExternalInterface.call('s3_swf.onUploadingStart');
+ // ExternalInterface.call('s3_swf.jsLog','onUploadingStart called');
+ // ExternalInterface.call('s3_swf.jsLog','Uploading next file...');
uploadNextFile();
+ // ExternalInterface.call('s3_swf.jsLog','Next file uploaded');
} else {
+ // ExternalInterface.call('s3_swf.jsLog','Calling onQueueEmpty...');
ExternalInterface.call('s3_swf.onQueueEmpty',this);
+ // ExternalInterface.call('s3_swf.jsLog','onQueueEmpty called');
}
}
// Cancel Current File Upload
// Which stops all future uploads as well
private function stopUploadingHandler():void{
+ // ExternalInterface.call('s3_swf.jsLog','stopUploadingHandler');
if (this.length > 0){
var current_file:FileReference = FileReference(this.getItemAt(0));
+ // ExternalInterface.call('s3_swf.jsLog','Cancelling current file...');
current_file.cancel();
+ // ExternalInterface.call('s3_swf.jsLog','Current file cancelled');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadingStop...');
ExternalInterface.call('s3_swf.onUploadingStop');
- } else {
- ExternalInterface.call('s3_swf.onQueueEmpty',this);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadingStop called');
+ } else {
+ // ExternalInterface.call('s3_swf.jsLog','Calling onQueueEmpty...');
+ ExternalInterface.call('s3_swf.onQueueEmpty',this.toJavascript());
+ // ExternalInterface.call('s3_swf.jsLog','onQueueEmpty called');
}
}
+
+ // This is a rather silly function to need, especially since it worked at one point
+ // In flash player 10.1, you could no longer send files over external reference
+ // This is the hack to get around the problem. Essentially: turn all those
+ // Files into objects
+ // August 27, 2010 - NCC@BNB
+ public function toJavascript():Object {
+ var faux_queue:Object = new Object();
+ faux_queue.files = new Array();
+ for (var i:int = 0;i < source.length; i++) {
+ faux_queue.files[i] = new Object();
+ faux_queue.files[i].name = source[i].name;
+ faux_queue.files[i].size = source[i].size;
+ faux_queue.files[i].type = source[i].type;
+ }
+ return faux_queue;
+ }
}
}
View
23 flex_src/src/com/nathancolgate/s3_swf_upload/S3Signature.as
@@ -45,27 +45,27 @@ package com.nathancolgate.s3_swf_upload {
}
private function openHandler(event:Event):void {
- ExternalInterface.call('s3_swf.onSignatureOpen',_file,event);
+ ExternalInterface.call('s3_swf.onSignatureOpen',toJavascript(_file),event);
}
private function progressHandler(progress_event:ProgressEvent):void {
- ExternalInterface.call('s3_swf.onSignatureProgress',_file,progress_event);
+ ExternalInterface.call('s3_swf.onSignatureProgress',toJavascript(_file),progress_event);
}
private function securityErrorHandler(security_error_event:SecurityErrorEvent):void {
- ExternalInterface.call('s3_swf.onSignatureSecurityError',_file,security_error_event);
+ ExternalInterface.call('s3_swf.onSignatureSecurityError',toJavascript(_file),security_error_event);
}
private function httpStatusHandler(http_status_event:HTTPStatusEvent):void {
- ExternalInterface.call('s3_swf.onSignatureHttpStatus',_file,http_status_event);
+ ExternalInterface.call('s3_swf.onSignatureHttpStatus',toJavascript(_file),http_status_event);
}
private function ioErrorHandler(io_error_event:IOErrorEvent):void {
- ExternalInterface.call('s3_swf.onSignatureIOError',_file,io_error_event);
+ ExternalInterface.call('s3_swf.onSignatureIOError',toJavascript(_file),io_error_event);
}
private function completeHandler(event:Event):void {
- ExternalInterface.call('s3_swf.onSignatureComplete',_file,event);
+ ExternalInterface.call('s3_swf.onSignatureComplete',toJavascript(_file),event);
var loader:URLLoader = URLLoader(event.target);
var xml:XML = new XML(loader.data);
@@ -79,7 +79,7 @@ package com.nathancolgate.s3_swf_upload {
upload_options.Secure = xml.https;
if (xml.errorMessage != "") {
- ExternalInterface.call('s3_swf.onSignatureXMLError',_file,xml.errorMessage);
+ ExternalInterface.call('s3_swf.onSignatureXMLError',toJavascript(_file),xml.errorMessage);
return;
}
@@ -101,5 +101,14 @@ package com.nathancolgate.s3_swf_upload {
return fileName;
}
+ // Turns a FileReference into an Object so that ExternalInterface doesn't choke
+ private function toJavascript(file:FileReference):Object{
+ var javascriptable_file:Object = new Object();
+ javascriptable_file.name = file.name;
+ javascriptable_file.size = file.size;
+ javascriptable_file.type = file.type;
+ return javascriptable_file;
+ }
+
}
}
View
24 flex_src/src/com/nathancolgate/s3_swf_upload/S3Upload.as
@@ -37,36 +37,60 @@ package com.nathancolgate.s3_swf_upload {
// But sometimes, after stopping and restarting the queeue
// It gets called multiple times
// BUG BUG BUG!
+ // ExternalInterface.call('s3_swf.jsLog','openHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadOpen...');
ExternalInterface.call('s3_swf.onUploadOpen',_upload_options,event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadOpen called');
}
// called during the file _upload_options of each file being _upload_optionsed
// we use this to feed the progress bar its data
private function progressHandler(progress_event:ProgressEvent):void {
+ // ExternalInterface.call('s3_swf.jsLog','progressHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadProgress...');
ExternalInterface.call('s3_swf.onUploadProgress',_upload_options,progress_event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadProgress called');
}
// only called if there is an error detected by flash player browsing or _upload_optionsing a file
private function ioErrorHandler(io_error_event:IOErrorEvent):void{
+ // ExternalInterface.call('s3_swf.jsLog','ioErrorHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadIOError...');
ExternalInterface.call('s3_swf.onUploadIOError',_upload_options,io_error_event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadIOError called');
}
private function httpStatusHandler(http_status_event:HTTPStatusEvent):void {
+ // ExternalInterface.call('s3_swf.jsLog','httpStatusHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadHttpStatus...');
ExternalInterface.call('s3_swf.onUploadHttpStatus',_upload_options,http_status_event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadHttpStatus called');
}
// only called if a security error detected by flash player such as a sandbox violation
private function securityErrorHandler(security_error_event:SecurityErrorEvent):void{
+ // ExternalInterface.call('s3_swf.jsLog','securityErrorHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadSecurityError...');
ExternalInterface.call('s3_swf.onUploadSecurityError',_upload_options,security_error_event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadSecurityError called');
}
private function completeHandler(event:Event):void{
+ // ExternalInterface.call('s3_swf.jsLog','completeHandler');
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadComplete...');
ExternalInterface.call('s3_swf.onUploadComplete',_upload_options,event);
+ // ExternalInterface.call('s3_swf.jsLog','onUploadComplete called');
+ // ExternalInterface.call('s3_swf.jsLog','Removing item from global queue...');
Globals.queue.removeItemAt(0);
+ // ExternalInterface.call('s3_swf.jsLog','Item removed from global queue');
if (Globals.queue.length > 0){
+ // ExternalInterface.call('s3_swf.jsLog','Uploading next item in global queue...');
Globals.queue.uploadNextFile();
+ // ExternalInterface.call('s3_swf.jsLog','Next ttem in global queue uploaded');
} else {
+ // ExternalInterface.call('s3_swf.jsLog','Calling onUploadingFinish...');
ExternalInterface.call('s3_swf.onUploadingFinish');
+ // ExternalInterface.call('s3_swf.jsLog','onUploadingFinish called');
}
}
View
BIN lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf
Binary file not shown.
View
10 s3_swf_upload.gemspec
@@ -2,20 +2,20 @@
Gem::Specification.new do |s|
s.name = %q{s3_swf_upload}
- s.version = "0.2.0"
+ s.version = "0.3.0"
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
s.authors = ["Nathan Colgate"]
- s.date = %q{2010-04-28}
+ s.date = %q{2010-08-27}
s.description = %q{Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior.}
s.email = %q{nathan@brandnewbox.com}
- s.extra_rdoc_files = ["README.textile", "lib/patch/integer.rb", "lib/s3_swf_upload.rb", "lib/s3_swf_upload/railtie.rb", "lib/s3_swf_upload/railties/generators/s3_swf_upload.rb", "lib/s3_swf_upload/railties/generators/uploader/USAGE", "lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb", "lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb", "lib/s3_swf_upload/railties/tasks/crossdomain.xml", "lib/s3_swf_upload/railties/tasks/s3_swf_upload.rake", "lib/s3_swf_upload/s3_config.rb", "lib/s3_swf_upload/signature.rb", "lib/s3_swf_upload/view_helpers.rb"]
- s.files = ["MIT-LICENSE", "Manifest", "README.textile", "Rakefile", "flex_src/compile", "flex_src/src/Globals.as", "flex_src/src/S3Uploader.as", "flex_src/src/com/adobe/net/MimeTypeMap.as", "flex_src/src/com/elctech/S3UploadOptions.as", "flex_src/src/com/elctech/S3UploadRequest.as", "flex_src/src/com/nathancolgate/s3_swf_upload/BrowseButton.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Queue.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Signature.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Upload.as", "lib/patch/integer.rb", "lib/s3_swf_upload.rb", "lib/s3_swf_upload/railtie.rb", "lib/s3_swf_upload/railties/generators/s3_swf_upload.rb", "lib/s3_swf_upload/railties/generators/uploader/USAGE", "lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb", "lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb", "lib/s3_swf_upload/railties/tasks/crossdomain.xml", "lib/s3_swf_upload/railties/tasks/s3_swf_upload.rake", "lib/s3_swf_upload/s3_config.rb", "lib/s3_swf_upload/signature.rb", "lib/s3_swf_upload/view_helpers.rb", "s3_swf_upload.gemspec"]
+ s.extra_rdoc_files = ["CHANGELOG", "README.textile", "lib/patch/integer.rb", "lib/s3_swf_upload.rb", "lib/s3_swf_upload/railtie.rb", "lib/s3_swf_upload/railties/generators/s3_swf_upload.rb", "lib/s3_swf_upload/railties/generators/uploader/USAGE", "lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb", "lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb", "lib/s3_swf_upload/railties/tasks/crossdomain.xml", "lib/s3_swf_upload/railties/tasks/s3_swf_upload.rake", "lib/s3_swf_upload/s3_config.rb", "lib/s3_swf_upload/signature.rb", "lib/s3_swf_upload/view_helpers.rb"]
+ s.files = ["CHANGELOG", "MIT-LICENSE", "Manifest", "README.textile", "Rakefile", "flex_src/bin-release/flex-config.xml", "flex_src/compile", "flex_src/src/Globals.as", "flex_src/src/S3Uploader.as", "flex_src/src/com/adobe/net/MimeTypeMap.as", "flex_src/src/com/elctech/S3UploadOptions.as", "flex_src/src/com/elctech/S3UploadRequest.as", "flex_src/src/com/nathancolgate/s3_swf_upload/BrowseButton.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Queue.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Signature.as", "flex_src/src/com/nathancolgate/s3_swf_upload/S3Upload.as", "lib/patch/integer.rb", "lib/s3_swf_upload.rb", "lib/s3_swf_upload/railtie.rb", "lib/s3_swf_upload/railties/generators/s3_swf_upload.rb", "lib/s3_swf_upload/railties/generators/uploader/USAGE", "lib/s3_swf_upload/railties/generators/uploader/templates/amazon_s3.yml", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_down_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_over_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_up_button.gif", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.js", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_upload.swf", "lib/s3_swf_upload/railties/generators/uploader/templates/s3_uploads_controller.rb", "lib/s3_swf_upload/railties/generators/uploader/uploader_generator.rb", "lib/s3_swf_upload/railties/tasks/crossdomain.xml", "lib/s3_swf_upload/railties/tasks/s3_swf_upload.rake", "lib/s3_swf_upload/s3_config.rb", "lib/s3_swf_upload/signature.rb", "lib/s3_swf_upload/view_helpers.rb", "s3_swf_upload.gemspec"]
s.homepage = %q{http://github.com/nathancolgate/s3-swf-upload-plugin}
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "S3_swf_upload", "--main", "README.textile"]
s.require_paths = ["lib"]
s.rubyforge_project = %q{s3_swf_upload}
- s.rubygems_version = %q{1.3.6}
+ s.rubygems_version = %q{1.3.5}
s.summary = %q{Rails 3 gem that allows you to upload files directly to S3 from your application using flex for file management, css for presentation, and javascript for behavior.}
if s.respond_to? :specification_version then

0 comments on commit a51d9cb

Please sign in to comment.