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

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 Ответ

2 голосов
/ 23 февраля 2011

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

По сути, система позволяет загружать один файл из Flex в Google App Engine, затем она использует API-интерфейс Image App Engine для создания миниатюр, а также конвертировать изображение в JPEG, а затем загружать его в корзину S3. boto библиотека используется для подключения к Amazon S3, вы можете просмотреть весь код проекта здесь на 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),    
    ...

Просмотров: 1021 * *

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")  
...