2011-06-22 123 views
0

我使用Django谷歌應用程序引擎。我正在嘗試上傳圖片。谷歌應用程序引擎與Django上傳文件錯誤

我犯了一個形式

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

爲什麼這個錯誤?????

回答

0

我沒有使用谷歌應用程序引擎,但是這是我會怎麼做一個純粹的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),我們從clean_data中捕獲image_file,然後我們可以用它做一些事情。
  8. 如果有錯誤(upload_image_form.is_valid()爲False),則模板將重新顯示並顯示錯誤消息。
0

很簡單,

編輯這一行:

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

這一個:

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

確保您使用的Django 1。2

0

試試這個..它爲我工作... :)

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>') 
相關問題