2013-02-10 95 views
5

我一直在處理這個照片管理器和共享應用程序第一部分http://lightbird.net/dbe/photo.html。我試圖生成一個縮略圖,當我這樣做。我得到這個錯誤。Django錯誤(13,'Permission denied')

我有Windows Vista。

IOError at /admin/photo/image/add/ 
    (13, 'Permission denied') 
    Request Method: POST 
    Request URL: http://127.0.0.1:8000/admin/photo/image/add/ 
    Django Version: 1.4.3 
    Exception Type: IOError 
    Exception Value: (13, 'Permission denied') 

    Exception Location:C:\Python26\lib\site-packages\PIL\Image.py in save, line 1399 
    Python Executable:C:\Python26\python.exe 
    Python Version: 2.6.0 
    Python Path: 

    ['C:\\djcode\\mysite', 
    'C:\\Python26\\python26.zip', 
    'C:\\Python26\\DLLs', 
    'C:\\Python26\\lib', 
    'C:\\Python26\\lib\\plat-win', 
    'C:\\Python26\\lib\\lib-tk', 
    'C:\\Python26', 
    'C:\\Python26\\lib\\site-packages', 
    'C:\\Python26\\lib\\site-packages\\PIL'] 

    Server time: Sun, 10 Feb 2013 23:49:34 +1100 

models.py

from django.db import models 
from django.contrib.auth.models import User 
from django.contrib import admin 
from string import join 
from django.core.files import File 
from os.path import join as pjoin 
from tempfile import * 

import os 
from PIL import Image as PImage 
from mysite.settings import MEDIA_ROOT 


class Album(models.Model): 
    title = models.CharField(max_length=60) 
    public = models.BooleanField(default=False) 
    def __unicode__(self): 
     return self.title 

class Tag(models.Model): 
    tag = models.CharField(max_length=50) 
    def __unicode__(self): 
     return self.tag 

class Image(models.Model): 
    title = models.CharField(max_length=60, blank=True, null=True) 
    image = models.FileField(upload_to="images/") 
    tags = models.ManyToManyField(Tag, blank=True) 
    albums = models.ManyToManyField(Album, blank=True) 
    created = models.DateTimeField(auto_now_add=True) 
    rating = models.IntegerField(default=50) 
    width = models.IntegerField(blank=True, null=True) 
    height = models.IntegerField(blank=True, null=True) 
    user = models.ForeignKey(User, null=True, blank=True) 
    thumbnail2 = models.ImageField(upload_to="images/", blank=True, null=True) 

    def __unicode__(self): 
     return self.image.name 
    def save(self, *args, **kwargs): 
     """Save image dimensions.""" 
     super(Image, self).save(*args, **kwargs) 
     im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
     self.width, self.height = im.size 

     # large thumbnail 
     fn, ext = os.path.splitext(self.image.name) 
     im.thumbnail((128,128), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb2" + ext 
     tf2 = NamedTemporaryFile() 
     im.save(tf2.name, "JPEG") 
     self.thumbnail2.save(thumb_fn, File(open(tf2.name)), save=False) 
     tf2.close() 

     # small thumbnail 
     im.thumbnail((40,40), PImage.ANTIALIAS) 
     thumb_fn = fn + "-thumb" + ext 
     tf = NamedTemporaryFile() 
     im.save(tf.name, "JPEG") 
     self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
     tf.close() 

     super(Image, self).save(*args, ** kwargs) 

    def size(self): 
     """Image size.""" 
     return "%s x %s" % (self.width, self.height) 

    def __unicode__(self): 
     return self.image.name 

    def tags_(self): 
     lst = [x[1] for x in self.tags.values_list()] 
     return str(join(lst, ', ')) 

    def albums_(self): 
     lst = [x[1] for x in self.albums.values_list()] 
     return str(join(lst, ', ')) 

    def thumbnail(self): 
     return """<a href="/media/%s"><img border="0" alt="" src="/media/%s" height="40" /></a>""" % (
                   (self.image.name, self.image.name)) 
    thumbnail.allow_tags = True 
class AlbumAdmin(admin.ModelAdmin): 
    search_fields = ["title"] 
    list_display = ["title"] 

class TagAdmin(admin.ModelAdmin): 
    list_display = ["tag"] 

class ImageAdmin(admin.ModelAdmin): 
    search_fields = ["title"] 
    list_display = ["__unicode__", "title", "user", "rating", "size", "tags_", "albums_","thumbnail", "created"] 
    list_filter = ["tags", "albums"] 
def save_model(self, request, obj, form, change): 
    obj.user = request.user 
    obj.save() 

的問題是在這裏:

from django.core.files import File 
from os.path import join as pjoin 
from tempfile import * 

class Image(models.Model): 
    # ... 

    thumbnail2 = models.ImageField(upload_to="images/", blank=True, null=True) 

def save(self, *args, **kwargs): 
    """Save image dimensions.""" 
    super(Image, self).save(*args, **kwargs) 
    im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
    self.width, self.height = im.size 

    # large thumbnail 
    fn, ext = os.path.splitext(self.image.name) 
    im.thumbnail((128,128), PImage.ANTIALIAS) 
    thumb_fn = fn + "-thumb2" + ext 
    tf2 = NamedTemporaryFile() 
    im.save(tf2.name, "JPEG") 
    self.thumbnail2.save(thumb_fn, File(open(tf2.name)), save=False) 
    tf2.close() 

    # small thumbnail 
    im.thumbnail((40,40), PImage.ANTIALIAS) 
    thumb_fn = fn + "-thumb" + ext 
    tf = NamedTemporaryFile() 
    im.save(tf.name, "JPEG") 
    self.thumbnail.save(thumb_fn, File(open(tf.name)), save=False) 
    tf.close() 

    super(Image, self).save(*args, ** kwargs) 

如何解決這個問題?

+0

您是否製作上'MEDIA_ROOT'的「圖片」文件夾中的解決方案嗎? – asermax 2013-02-10 15:44:20

回答

1

它在我看來像django沒有權限它需要訪問您的MEDIA_ROOT文件夾。

看看你的settings.py文件中的MEDIA_ROOT設置。然後檢查文件夾的權限(類似於bash shell中的ls -lsa /path/to/media_root)。確保用戶運行django作爲文件夾的寫入權限。

此外,正如asermax指出的,確保您在MEDIA_ROOT中創建了一個圖像目錄。

看一看爲serving static files特別是部分中的文檔上serving other directories

UPDATE

也許是this issue。嘗試用im.save(tf2, "JPEG")

+0

我正在使用window vista atm。我找到了位於MEDIA_ROOT ='C:/ djcode/mysite/photo/media'的媒體文件夾,並且我完全控制了權限。該錯誤仍然出現。應該做什麼? – supersheep1 2013-02-10 13:59:28

+0

asermax,這是假設我的圖像文件夾C:/ djcode/mysite/photo/media' – supersheep1 2013-02-10 20:05:39

+0

不,您的圖像文件夾應該在C:/ djcode/mysite/photo/media/images。你已經在models.py的upload_to參數中表示你正在將圖像上傳到這個目錄。正如asermax正確指出的那樣,如果您尚未創建文件夾,您將需要創建該文件夾。 – 2013-02-10 22:32:39

相關問題