【问题标题】:How to save an image using django imageField?如何使用 django imageField 保存图像?
【发布时间】:2012-02-08 00:20:58
【问题描述】:

从应用程序(iOS android 等)发布,而不是网络表单。

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

@csrf_exempt
def saveImage(request):

如何写视图?它在发布请求中接收图像。 我发现的每件事都与表单相关(服务器新手)

【问题讨论】:

  • 看看django-photologue,你想做的都已经做完了:)
  • 谢谢,我不需要所有这些功能,我正在寻找imageField的最基本用法:)

标签: python django imagefield


【解决方案1】:

仅仅因为您没有使用实际的 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') 到磁盘我看到了文件,但我必须在路径开头添加'/'。有任何想法吗?谢谢
  • 糟糕,图像保存得很好,只是与项目文件夹相关,而不是我计算机的根文件夹,非常感谢!
  • 并且不要忘记在表单模板中包含enctype="multipart/form-data",如stackoverflow.com/a/5567063/955619所述
【解决方案2】:

编辑: 请使用上面选择的答案 - 下面的代码适用于该问题,但不推荐。

您要上传的图片文件位于:

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

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

【讨论】:

  • 谢谢,我知道。怎么办?流程是什么?我是否将其保存到物理文件并仅将路径传递给 imageField?任何 sn-ps 都应该是一项非常常见的任务,谢谢!
  • 我已经用示例代码更新了答案。如果您使用模型表单,代码会更简单、更安全。
猜你喜欢
  • 2016-04-23
  • 2015-03-30
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多