【问题标题】:sorl-thumnail resizing and savingsorl-thumbnail 调整大小和保存
【发布时间】:2012-03-03 19:16:26
【问题描述】:

我正在尝试使用 sorl-thumnail 来调整视图中的图像大小,然后保存它并在调用 get_thumnail() 时获取 IOError。我还需要知道如何保存调整大小的图像。抱歉,如果您认为这很愚蠢..我是 Django 新手。

模型.py:

from django.db import models
from django.forms import ModelForm
from sorl.thumbnail import ImageField

class BasicModel(models.Model):
    name = models.CharField(max_length=200)
    dob = models.DateField()
    photo = ImageField(upload_to='sample')

class BasicModelForm(ModelForm):
    class Meta:
            model = BasicModel

Views.py:

def BasicView(request):
    if request.method == 'POST':
            form = BasicModelForm(request.POST, request.FILES)
            if form.is_valid():
                    im = get_thumbnail(request.FILES['photo'], '100x100', crop='center', quality=99)
                    data = form.save()
                    return preview(request, data.id, im)
    else:
            form = BasicModelForm()
    return render_to_response("unnamed.html", {'form': form}, context_instance=RequestContext(request))

def preview(request, id, im):
    obj = get_object_or_404(BasicModel, pk=id)
    return render_to_response("preview.html", {'obj': obj, 'im': im})

preview.html:

{{ obj.name }}
{{ obj.dob }}
{% load thumbnail %}
{% thumbnail im "100x100" as image %}
<img src="{{ image.url }}" width="{{ image.width }}" height="{{ image.height }}">
{% endthumbnail %}

Settings.py:

MEDIA_ROOT = '/home/nirmal/try/files/'
MEDIA_URL = 'http://localhost:8000/files/'

错误:

Exception Type: IOError
Exception Value:    
[Errno 2] No such file or directory: u'/home/nirmal/try/files/wp.jpg'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/core/files/storage.py in _open, line 159
Traceback: im = get_thumbnail(request.FILES['photo'], '100x100', crop='center', quality=99) 

有人可以帮我解决这个问题吗? 谢谢!

【问题讨论】:

    标签: python django sorl-thumbnail


    【解决方案1】:

    您不能在此处使用 request.FILES['photo'] 因为上传的文件可能在内存中或其他地方。首先将此文件保存到文件系统,然后使用 get_thumbnail。例如,您可以在 form.save() 返回后在对象上调用它。

    【讨论】:

      【解决方案2】:

      如果您想直接访问上传的文件,那么首先您必须获取上传临时内存的路径。

      import os
      import tempfile
      
      def _file_path(uploaded_file):
          '''  Converts InMemoryUploadedFile to on-disk file so it will have path. '''
          try:
              return uploaded_file.temporary_file_path()
          except AttributeError:
              fileno, path = tempfile.mkstemp()
              temp_file = os.fdopen(fileno,'w+b')
              for chunk in uploaded_file.chunks():
                  temp_file.write(chunk)
              temp_file.close()
              return path
      

      然后就可以访问上传的文件路径了:

      path = _file_path(request.FILES['photo'])
      

      【讨论】:

        猜你喜欢
        • 2011-07-31
        • 2012-03-10
        • 1970-01-01
        • 2011-06-10
        • 2015-01-16
        • 1970-01-01
        • 2015-06-28
        • 2017-08-09
        • 2014-10-14
        相关资源
        最近更新 更多