2012-01-11 76 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

相关问题