1

我試圖在上傳到S3存儲桶之前使用PIL調整圖像大小。
模型表單工作得很好,除了圖像調整大小沒有發生。調整圖像大小,從Django模型表單上載到亞馬遜s3存儲桶之前調整圖像

以下是我的模型:

class ImageDetail(models.Model): 

    def upload_image(self, filename): 
     return u'obj/{name}.{ext}'.format(   
      name = uuid.uuid4().hex, 
      ext = os.path.splitext(filename)[1].strip('.') 
     ) 
    flag = models.IntegerField(default=0) 
    view = models.IntegerField(default=0) 
    title = models.CharField(max_length=500, help_text="Enter a small/suitable title") 
    image = models.ImageField(upload_to = upload_image, 
          help_text="Please ensure, image size is less than 1 MB") 

瀏覽文件,如下所示:

form = ImageUploadForm(request.POST or None, request.FILES or None) 
if form.is_valid() and request.POST: 
    form_instance = form.save(commit=False) 
    img = form_instance.image 
    # process the image now 
    if img.width > 300 or img.height > 200: 
     IMG_TYPE = os.path.splitext(img.name)[1].strip('.').lower() 
     if IMG_TYPE == 'jpeg': 
      PIL_TYPE = 'jpeg' 
      FILE_EXTENSION = 'jpeg' 
     elif IMG_TYPE == 'jpg': 
      PIL_TYPE = 'jpeg' 
      FILE_EXTENSION = 'jpeg' 
     elif IMG_TYPE == 'png': 
      PIL_TYPE = 'png' 
      FILE_EXTENSION = 'png' 
     elif IMG_TYPE == 'gif': 
      PIL_TYPE = 'gif' 
      FILE_EXTENSION = 'gif' 
     else: 
      print 'Not a valid format' 
      return 
     im = Image.open(StringIO(img.read())) 
     im.thumbnail((300, 180), Image.ANTIALIAS) 
     #Save the image 
     temp_handle = StringIO() 
     im.save(temp_handle, PIL_TYPE) 
     s3 = S3Custom() 
     if not form_instance.image: 
      return self.success(self.request, form, None, errors = 'Error while uploading the image') 
     form_instance.save() 

的S3自定義函數的定義如下:

class S3Custom(object): 
    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY) 
    b = Bucket(conn, settings.AWS_STORAGE_BUCKET_NAME) 
    k = Key(b) 
    def upload_file(self, ruta, prefix): 
     try:   
      self.k.key = '%s/%s' % (prefix, os.path.split(ruta)[-1]) 
      self.k.set_contents_from_filename(ruta) 
      self.k.make_public() 
     except Exception, e: 
      print e 
     return '%s%s' % (settings.S3_URL, self.k.key) 

我已經安裝了django-storage 。麻煩的是,圖像上傳得很好,但沒有正確調整大小。我錯過了什麼?我錯了嗎

im.save(temp_handle, PIL_TYPE) 
s3 = S3Custom() 
form_instance.save()   

在視圖文件中? 請讓我知道,謝謝!

回答

0

所以,首先要做的事情是:你幾乎肯定不想同步調整大小 - 相反,啓動一個Celery任務(或類似的)以在保存原始數據後異步執行調整大小。

這且不說,你永遠不會做與s3對象任何東西 - s3.upload_file不會做太多,如果它從來不叫......

(我也推薦使用某種靜態分析儀將發出警告,未使用的變量!)

+0

感謝您的回答,我無法弄清楚的問題是如何將圖像gettting上傳到AWS機器。 – whatf

+0

懷疑你正在用'django-storages'做別的事情,但需要看到更多的代碼(例如'ImageUploadForm' ...) –