captionmash.comで作業しているときに、同様の問題(FlexからDjangoに1枚の写真をアップロードする)に取り組む必要がありました。おそらくそれが役立つでしょう。通常のメッセージングにはPyAMFを使用していましたが、FileReferenceクラスにはuploadメソッドが組み込まれているため、簡単な方法を選択しました。
基本的に、システムでは1つのファイルをFlexからGoogle App Engineにアップロードし、AppEngineのImageAPIを使用してサムネイルを作成し、画像をJPEGに変換して、S3バケットにアップロードします。botoライブラリはAmazonS3接続に使用されます。プロジェクトのコード全体は、ここgithubで表示できます。
このコードは単一ファイルのアップロード専用ですが、FileReferenceオブジェクトの配列を作成し、それらすべてでuploadメソッドを呼び出すことで、複数ファイルのアップロードを実行できるはずです。
ここに投稿しているコードは少しクリーンアップされています。それでも問題が解決しない場合は、リポジトリを確認する必要があります。
クライアント側(フレックス):
private function upload(fileReference:FileReference,
album_id:int,
user_id:int):void{
try {
//500 kb image size
if(fileReference.size > ApplicationConstants.IMAGE_SIZE_LIMIT){
trace("File too big"+fileReference.size);
return;
}
fileReference.addEventListener(Event.COMPLETE,onComplete);
var data:URLVariables = new URLVariables();
var request:URLRequest = new URLRequest(ApplicationConstants.DJANGO_UPLOAD_URL);
request.method = URLRequestMethod.POST;
request.data = data;
fileReference.upload(request,"file");
//Popup indefinite progress bar
} catch (err:Error) {
trace("ERROR: zero-byte file");
}
}
//When upload complete
private function onComplete(evt:Event):void{
fileReference.removeEventListener(Event.COMPLETE,onComplete);
//Do other stuff (remove progress bar etc)
}
サーバー側(App EngineのDjango):
URL:
urlpatterns = patterns('',
...
(r'^upload/$', receive_file),
...
ビュー:
def receive_file(request):
uploadService = UploadService()
file = request.FILES['file']
uploadService.receive_single_file(file)
return HttpResponse()
UploadServiceクラス
import uuid
from google.appengine.api import images
from boto.s3.connection import S3Connection
from boto.s3.key import Key
import mimetypes
import settings
def receive_single_file(self,file):
uuid_name = str(uuid.uuid4())
content = file.read()
image_jpeg = self.create_jpeg(content)
self.store_in_s3(uuid_name, image_jpeg)
thumbnail = self.create_thumbnail(content)
self.store_in_s3('tn_'+uuid_name, thumbnail)
#Convert image to JPEG (also reduce size)
def create_jpeg(self,content):
img = images.Image(content)
img_jpeg = images.resize(content,img.width,img.height,images.JPEG)
return img_jpeg
#Create thumbnail image using file
def create_thumbnail(self,content):
image = images.resize(content,THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT,images.JPEG)
return image
def store_in_s3(self,filename,content):
conn = S3Connection(settings.ACCESS_KEY, settings.PASS_KEY)
b = conn.get_bucket(BUCKET_NAME)
mime = mimetypes.guess_type(filename)[0]
k = Key(b)
k.key = filename
k.set_metadata("Content-Type", mime)
k.set_contents_from_string(content)
k.set_acl("public-read")