2011-05-04 95 views
2

我想爲上傳的圖像創建縮略圖。我知道有一些庫可用,但我有非常基本的需求,我寧願自己做這個。Django保存文件

我的模型是這樣的:

from image_tools import resize 

class Photo(models.Model): 
    # some fields 
    image = models.ImageField(
       upload_to='images', 
       height_field='height', 
       width_field='width' 
      ) 
    thumb = models.ImageField(
     upload_to='thumbs', 
     editable=False 
    ) 

    def save(self): 
     self.thumb = self.image 
     resize(self.image.path, self.thumb.path, 50, 40) 
     super(Photo, self).save() 

這裏resize()是一個簡單的功能我已經寫了,其作爲參數的原始文件路徑和目標路徑的維度和存儲縮略圖。唯一的問題是此時該文件還沒有在磁盤上。

有沒有辦法強制保存文件本身的位置,以便它可以用於我的功能?

請隨時提出更好的方法來處理此事。不過,我想知道如何處理尚未保存的文件,無論最佳解決方案如何。

回答

1

有幾種方法可以做到這一點。一個你有原始圖像數據,你可以很容易地將它寫入文件(查看上傳的django文件,瞭解如何將上傳的文件保存到磁盤)。你可以讀取你的django進程(或apache)有權訪問的任何文件,而不僅僅是你的django實例的路徑。

可以保存在此之前做的另一件事是使用PIL縮略圖圖像並保存:
http://effbot.org/imagingbook/image.htm

您也可以上傳數據使用博託S3到S3,如果你需要的圖片託管在一個CDN。

+0

我已閱讀Django的文件上傳,我沒有找到答案,我的問題。你能更具體一點嗎? 「一旦你有了原始的圖像數據,你可以很容易地將它寫入文件」正是我所要求的。 – Andrea 2011-05-05 10:40:47

1

直接存儲文件是不是一個好主意,因爲你忽略默認文件存儲(即文件系統,Amazon S3的,...)

更好的方法是使用Django File類

from django.core.files import File 
# Create a Python file object using open() and the with statement 
>>> with open('/tmp/hello.world', 'w') as f: 
...  myfile = File(f) 
...  myfile.write('Hello World') 

而且要刪除的文件使用下面的默認存儲類 見鏈接查看更多細節 https://docs.djangoproject.com/en/1.5/topics/files/