Google App Engine с ошибкой загрузки файла Django - PullRequest
0 голосов
/ 22 июня 2011

Я использую Django с Google App Engine. Я пытаюсь загрузить изображения.

я сделал форму

<form enctype="multipart/form-data" action="addImage" method="post">
        <p>Title of the Image: 
        <input type="text" name="title"  /></p>
        <p>Please select image to upload: 
        <input type="file" name="img" required="True"/></p>
        <p><input type="submit" value="Upload" /></p>
    </form>

сопоставляя это с этим представлением

def addImage(request):
    image = Image()
    image.title = request.POST.get("title")
    img = images.resize(request.POST.get('img'),50,50)
    image.blob = db.Blob(img)
    image.put()
    return HttpResponse('<html><head><meta HTTP-EQUIV="REFRESH" content="2; url=/"></head><body>One item added successfuly </body></html>')

это дает мне эту ошибку в сеансе отладки

Exception Type: NotImageError
Exception Value:Empty image data.

ПОЧЕМУ ?????

Ответы [ 3 ]

0 голосов
/ 23 июня 2011

очень просто,

отредактируйте эту строку:

img = images.resize(request.POST.get('img'),50,50)

с этой:

img = request.FILES['img'].read() 

убедитесь, что вы используете django 1.2

0 голосов
/ 17 июля 2011

Попробуйте это .. это работает для меня ...:)

def addImage(request):
  image = Image()
  image.title = request.POST.get("title")
  image.blob = db.Blob(str(request.FILES['img']['content']))
  image.put()
  return HttpResponse('<html><head><meta HTTP-EQUIV="REFRESH" content="2; url=/"></head><body>One item added successfuly </body></html>')
0 голосов
/ 22 июня 2011

Я не использовал Google App Engine, но так я бы делал на чистой установке Django 1.3:

forms.py:

from django import forms
from django.forms import fields

class UploadImageForm(forms.Form):
    image_file = fields.ImageField()

views.py:

from django.shortcuts import render_to_response
from django.template import RequestContext
from NAME_OF_YOUR_APP.forms import UploadImageForm

def addImage(request):

    if request.method == 'POST':
        upload_image_form = UploadImageForm(data=request.POST, files=request.FILES)

        if upload_image_form.is_valid():
            image_file = request.cleaned_data['image_file']
            # do something with the image...
            return ...

    else:
        upload_image_form = UploadImageForm()

    context = {'form':upload_image_form}
    return render_to_response('path/to/upload_template.html', context, context_instance=RequestContext(request))

upload_template.html:

<form enctype="multipart/form-data" action="" method="post">
    {% csrf_token %}
    <table>
        <tr>
            <td>{{ form.image_file.label_tag }}</td>
            <td>{{ form.image_file }}</td>
            <td>{% if form.image_file.errors %}{% for error in form.image_file.errors %}{{ error }}{% endfor %}{% endif %}</td>
        </tr>
    </table>
    <input type="submit" value="Submit"/>
</form>

Код вашего шаблона выглядит хорошо (его нет {% csrf_token %} что я не уверен, если GAE нужно или нет).Ваш код представления должен проверить, является ли запрос POST запросом или нет.

В моем примере я создал форму с именем UploadImageForm, которая принимает один image_file для загрузки.Логика работает так:

  1. Пользователь заходит на example.com/upload_image
  2. addImage() Запускается.Поскольку это GET, а не POST-запрос, он создает пустой UploadImageForm () и отображает его в upload_template.html.
  3. Пользователь отображает форму.
  4. Пользователь заполняет формуи отправляет изображение.
  5. Сервер получает запрос POST, и снова вызывается addImage().
  6. Мы связываем данные загруженного файла с UploadImageForm.
  7. Если ошибок нет(Например, upload_image_form.is_valid () - True), мы извлекаем файл image_file из cleaned_data, и затем можем что-то с ним сделать.
  8. Если есть ошибки (upload_image_form.is_valid () - False), шаблонповторно отображается с сообщениями об ошибках.
...