国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

django上傳圖片、使用PIL制作縮略圖并保存到sea的storage

2019-11-14 17:14:08
字體:
來源:轉載
供稿:網友

上傳圖片解析:

SAE的設置指引如下:

處理用戶上傳文件

在setttings.py中添加以下配置。

# 修改上傳時文件在內存中可以存放的最大size為10mFILE_UPLOAD_MAX_MEMORY_SIZE = 10485760# sae的本地文件系統是只讀的,修改django的file storage backend為StorageDEFAULT_FILE_STORAGE = 'sae.ext.django.storage.backend.Storage'# 使用media這個bucketSTORAGE_BUCKET_NAME = 'media'# ref: https://docs.djangoPRoject.com/en/dev/topics/files/

 

分兩種情況:
  • 圖片是數據庫中的一個字段,比如說:
class Picture(models.Model):    """docstring for Picture"""    user = models.ForeignKey(Customer)    image = ThumbnailImageField(upload_to='goods_photo')

 然后你只需要在視圖函數里面這么寫就ok了,這時候SAE是可以自動幫你幫圖片上傳到storage中的domain為media下的goods_photo文件夾下了(記得在SAE上激活storage并建立一個名為你在settings.py設定的STORAGE_BUCKET_NAME,還有在這個domain下面建立一個名為你設定的upload_to的值的文件夾)

def upload_photo(request):    f = request.FILES['upload_file']    name=copy.copy(f.name)    p = Picture()    p.image = f    user_id = request.POST['user_id']    user = Customer.objects.get(pk=user_id)    p.user = user    p.save()
  •  直接上傳圖片到storage

參考sea的storage的api文檔,鏈接

下面開始做正事了
我的目標是上傳一個圖片并生成一個縮略圖,圖片是數據庫的一個字段,縮略圖通過該數據庫的一個自定義屬性thumb_url 訪問這個縮略圖
自定義一個ThumbnailImageField,參考代碼如下
# ThumbnailImageField.pyfrom django.db.models.fields.files import ImageField,ImageFieldFilefrom PIL import Imagedef _add_thumb(s):    parts = s.split(".")    parts.insert(-1,"thumb")    if parts[-1].lower() not in ['jpeg','jpg']:        parts[-1]='jpg'    return ".".join(parts)class ThumbnailImageFieldFile(ImageFieldFile):    def _get_thumb_url(self):        return _add_thumb(self.url)    thumb_url = property(_get_thumb_url)    def save(self,name,content,save=True):        super(ThumbnailImageFieldFile, self).save(name,content,save)    def delete(self,save=True):        super(ThumbnailImageFieldFile, self).delete(save)        class ThumbnailImageField(ImageField):    """docstring for ThumbnailImageField"""    attr_class = ThumbnailImageFieldFile    def __init__(self,*args,**kwargs):        super(ThumbnailImageField, self).__init__(*args,**kwargs)
視圖函數參考如下
def upload_photo(request):    f = request.FILES['upload_file']    name=copy.copy(f.name)    p = Picture()    p.image = f    user_id = request.POST['user_id']    user = Customer.objects.get(pk=user_id)    p.user = user    p.save()    c = sae.storage.Connection()    bucket = c.get_bucket('media')    obj = bucket.get_object_contents("goods_photo/"+name)    image = Image.open(StringIO(obj))    image.thumbnail((90,90),Image.ANTIALIAS)    imgOut = StringIO()    image.save(imgOut, 'jpeg')    img_data = imgOut.getvalue()    bucket.put_object('goods_photo/'+_add_thumb(name), img_data)    imgOut.close()

 視圖函數詳細講解:

p.save()會消耗掉request.FILES['upload_file'],所以建議的做法是先保存這個文件到storage中,然后再從storage中把這個圖片取出來進行處理
name=copy.copy(f.name),之所以使用淺拷貝也是因為 p.save()會消耗掉request.FILES['upload_file'],直接name=f.name的話拿到的name就不知道是什么了,當然你也可以使用deepcopy,但是沒必要,因為name就是一個字符串
bucket.get_object_contents("goods_photo/"+name),sea的storage不支持直接的目錄結構,但可以通過文件名來模擬目錄結構

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 米脂县| 鄂托克前旗| 麟游县| 福安市| 资中县| 油尖旺区| 清新县| 乐至县| 永济市| 怀安县| 永济市| 兴国县| 苗栗市| 许昌县| 安阳县| 丁青县| 衡山县| 易门县| 上林县| 宜兰县| 乐昌市| 锡林浩特市| 沙田区| 玛曲县| 白河县| 璧山县| 永州市| 桂东县| 青河县| 南部县| 阳原县| 祁门县| 玉龙| 炎陵县| 泰来县| 石柱| 海盐县| 浦县| 钦州市| 清丰县| 文水县|