2012-01-11 89 views
6

從應用程序(iOS的Android等..)發佈不是一個Web表單。如何使用django imageField保存圖像?

class someImage(models.Model): 
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH) 

@csrf_exempt 
def saveImage(request): 

如何寫視圖?它會在發佈請求中收到圖片。 每一件事情我覺得是形式相關的(服務器新手)

+0

看看[Django的photologue] (http://code.google.com/p/django-photologue/),所有你想做的事情已經完成:) – juliomalegria 2012-01-11 16:30:53

+0

謝謝,我不需要所有這些功能,我正在尋找最基本的使用imageField :) – 2012-01-11 16:52:23

回答

15

只是因爲你使用的不是實際的HTML表單提交的數據並不意味着你不能使用ModelForm來處理請求:

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotAllowed 
from django.utils import simplejson 

def upload_view(request): 
    if request.method == 'POST': 
     form = UploadForm(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 
      result = {'success': True} 
      return HttpResponse(simplejson.dumps(result), mimetype='application/json') 
     else: 
      return HttpResponseBadRequest() 
    else: 
     return HttpResponseNotAllowed(['POST']) 
+0

我得到了結果成功,但我沒有看到文件被保存在我設置在模式(它是本地路徑:Users/yogevshelly/Downloads /)的路徑上,當我嘗試使用Image.save將圖像保存到磁盤( 'path','JPEG')我看到這個文件,但是我必須在路徑開頭添加'/'。有任何想法嗎?謝謝 – 2012-01-12 12:39:55

+0

糟糕,圖像保存得很好,只是關係到項目文件夾而不是我的電腦的根文件夾,非常感謝! – 2012-01-12 12:58:57

+0

不要忘記在表單模板中包含'enctype =「multipart/form-data」',如http://stackoverflow.com/a/5567063/955619 – Caumons 2013-09-02 23:19:59

3

編輯: 請使用上面選擇的答案 - 下面的代碼工作的問題,但不建議。

您正在上傳的圖像文件可以發現:

request.FILES['image'] # assuming input name is called 'image' 

不退還您的Image對象,而是一個UploadedFile的對象。您可以閱讀這部分文檔(我假設您使用的是Django 1.3.x):https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

它涵蓋了UploadedFile對象中可用的字段和方法,也是手動處理文件上傳的常用方法。您可以使用相同的方法將圖像文件寫入文件對象,然後將其保存到ImageField中。

下面的代碼應該可以工作,但它不是安全的代碼。我假設你正在使用* nix機器,如果沒有,請將目標文件保存在別的地方。

@csrf_exempt 
def saveImage(request): 
    # warning, code might not be safe 
    up_file = request.FILES['image'] 
    destination = open('/tmp/' + up_file.name , 'wb+') 
    for chunk in up_file.chunks(): 
     destination.write(chunk) 
    destination.close() 
    img = someImage() 
    img.image.save(up_file.name, File(open('/tmp/' + up_file.name, 'r'))) 
    img.save() 
    # return any response you want after this 

其他事情需要說明:請確保您形成具有以下屬性,它的工作:

<form enctype="multipart/form-data" ... > 

我不記得這個用法是正常的,但實際上,表單建議。

+0

謝謝,我知道。怎麼辦?流量是多少?我是否將它保存到物理文件中,並將路徑傳遞給imageField?任何片段應該是一個非常常見的任務,謝謝! – 2012-01-11 16:51:00

+0

我已經用示例代碼更新了答案。如果您使用模型表單,代碼會更簡單和更安全。 – 2012-01-11 17:17:11

相關問題