1

やあ!

  1. robotlegsでflexを使用して画像のグループをアップロードする必要があります。
  2. 画像のアップロード時にプログレスバーが機能する必要があります。
  3. 一度に1枚以上の画像をアップロードする場合があります。
  4. byteArrayをサーバーにアップロードしてから画像を保存するのがサーバーにとって重すぎるかどうかを知りたいです。
  5. サーバー側には、pyamfによって作成されたメソッドがあり、次のようになります。

def upload_image(input):
    # here does stuff. I need to be able to get parametters like this
    input.list_key
    # and here I need some help on how to save the file

ありがとう ;)

4

1 に答える 1

2

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")  
于 2011-02-23T20:45:25.400 に答える