Google AppEngine, Django и request.FILES - PullRequest
       2

Google AppEngine, Django и request.FILES

1 голос
/ 08 марта 2012

Ситуация : HTML-форма (с правильно установленными атрибутами method = "POST" и enctype = "multipart / form-data") отправляется на сервер, которым является Django в Google AppEngine. Он содержит файл ввода, который перемещается (не клонируется) в указанную форму и передается через iframe. Для небольших файлов (~ 1 МБ или меньше) отправленные файлы находятся в словаре request.FILES и хранятся в большом двоичном объекте. Для файлов выше 1 Мб, однако, просмотр request.FILES возвращает ошибку, утверждая, что ключ (который является именем элемента ввода файла) не найден в данном dict, и фактически, что request.FILES (и request.POST) пустые поля.

Вопрос : Это связано с ограничением AppEngine (если есть, есть ли обходной путь?) Это каким-то образом связано с Django (обратите внимание, что enctype и метод установлены правильно)? Какой-то другой элемент отсутствует?

Дополнительная информация : Обратите также внимание на то, что я программист на javascript, подменяющий отсутствующего программиста на Python, и знаю только основы. Пожалуйста, адаптируйте свои ответы соответственно.

Соответствующий Python:

def media_image_upload(request):
   if request.method == 'POST':
      img = request.FILES['img']

Соответствующий html:

<form id="hiddenUpForm" style="display:none;" action="http://localhost:8080/media/imageUpload" enctype="multipart/form-data" target="upTarget" method="POST">
  <input name="img" id="img" type="file" accept="image/*">
  <iframe id="upTarget" name="upTarget" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>
</form>

1 Ответ

2 голосов
/ 08 марта 2012

Я считаю, что для загрузки файлов размером более 1 МБ необходимо использовать API Blobstore для создания специального URL-адреса, который используется для загрузки;это не может быть ваш обычный URL <1 МБ. </p>

Код контроллера, который генерирует HTML-страницу, содержащую форму загрузки, будет использовать upload_url = blobstore.create_upload_url('media/imageUploadBig'), а затем добавит upload_url к значениям вашего шаблона и отобразитtemplate.

Шаблон, в свою очередь, будет содержать определение FORM примерно так:

<form id="hiddenUpForm" style="display:none;" action="{{ upload_url|safe }}" enctype="multipart/form-data" target="upTarget" method="POST">

Это означает, что вам необходимо иметь две разные формы - одну для файлов, которыеменьше 1 МБ и один для файлов большего размера - или вы можете хранить все свои изображения в Blobstore.

См. документацию Blobstore для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...