如何使用Django的ImageField保存图像?

7
从应用程序(iOS、Android等)发布,而不是从Web表单发布。
class someImage(models.Model):
    image = models.ImageField(upload_to= settings.SHARE_IMAGE_UPLOAD_PATH)

@csrf_exempt
def saveImage(request):

如何编写视图?视图接收来自POST请求的图像。

我发现所有相关的内容都与表单有关(我是服务器新手)。


看一下 django-photologue,你想做的一切都已经完成了 :) - juliomalegria
谢谢,我不需要所有这些功能,我只是在寻找imageField的最基本用法 :) - Yogev Shelly
2个回答

16

即使您没有使用实际的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'])

我得到了成功的结果,但是我没有看到文件被保存在我在模态框中设置的路径上(它是本地路径:Users/yogevshelly/Downloads/)。当我尝试使用Image.save('path','JPEG')将图像保存到磁盘时,我可以看到文件,但我必须在路径开头添加'/'。有什么想法吗?谢谢。 - Yogev Shelly
糟糕,图像保存得很好,只是相对于项目文件夹而不是我的计算机根文件夹,非常感谢! - Yogev Shelly
别忘了按照https://dev59.com/kHI-5IYBdhLWcg3wHUdB#5567063中所述,在表单模板中包括 enctype="multipart/form-data" - Caumons

6

编辑:请使用以上选择的答案——下面的代码可以解决问题,但不建议使用。

您正在上传的图像文件可以在以下位置找到:

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

我不记得这种用法是正常的,但实际上,建议使用表单。


谢谢,我知道了。现在怎么办?流程是什么?我要将它保存到物理文件中,然后只需将路径传递给imageField吗?有任何片段吗?这应该是一个非常常见的任务,谢谢! - Yogev Shelly
我已经更新了答案,并提供了示例代码。如果您使用模型表单,代码将更简单和安全。 - Victor Neo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接