如何使用Django ImageField保存图像?

7 投票
2 回答
24491 浏览
提问于 2025-04-17 10:01

这是在说从一个应用程序(比如iOS或安卓等)发送数据,而不是通过网页表单。

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

@csrf_exempt
def saveImage(request):

那么,怎么写这个视图呢?它需要在一个请求中接收一张图片。现在我找到的资料都是关于表单的(我对服务器还不太熟悉)。

2 个回答

6

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

你上传的图片文件可以在这里找到:

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

它不会返回一个图片对象,而是一个上传文件对象。你可以查看这部分文档(我假设你在使用Django 1.3.x):https://docs.djangoproject.com/en/1.3/topics/http/file-uploads/#handling-uploaded-files

文档中讲解了上传文件对象的字段和方法,以及手动处理文件上传的常见方法。你可以用同样的方法将图片文件写入一个文件对象,然后再保存到你的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" ... >

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

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'])

撰写回答