Как загрузить файлы в Flex, используя PyAMF или PhpAMF? на стороне клиента, и требуется очень небольшая помощь на стороне сервера

Hy!

  1. Мне нужно загрузить группу изображений, используя flex с robotlegs.
  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

Спасибо;)

1 ответ

Решение

Мне приходилось сталкиваться с подобной проблемой (загрузка одной фотографии из Flex в Django) во время работы на captionmash.com, может быть, это может вам помочь. Я использовал PyAMF для обычного обмена сообщениями, но класс FileReference имел встроенный метод загрузки, поэтому я выбрал простой способ.

По сути, система позволяет загружать один файл из Flex в Google App Engine, затем она использует API-интерфейс Image App Engine для создания миниатюр, а также конвертировать изображение в JPEG, а затем загружать его в корзину S3. Для подключения к Amazon S3 используется библиотека boto. Вы можете просмотреть весь код проекта здесь, на github.

Этот код предназначен только для загрузки одного файла, но вы должны иметь возможность выполнять загрузку нескольких файлов, создавая массив объектов FileReference и вызывая метод загрузки для всех из них.

Код, который я публикую здесь, немного очищен, если у вас все еще есть проблемы, вы должны проверить репо.

Клиентская сторона (Flex):

    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)
    }

Сторона сервера (Django на App Engine):

Urls:

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")  
Другие вопросы по тегам