Мне приходилось решать аналогичную проблему (загрузка одной фотографии из 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")