国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式

瀏覽:93日期:2024-09-15 15:31:56

最近在做一個仿知乎網站的項目了,里面涉及很多圖片和文件上傳。趁此機會我給大家總結下Django自定義圖片和文件上傳路徑的2種方式吧。

方法1: 在Django模型中定義upload_to選項。

Django模型中的ImageField和FileField的upload_to選項是必填項,其存儲路徑是相對于MEIDA_ROOT而來的。

我們來看一個簡單案例(如下所示)。如果你的MEDIA_ROOT是/media/文件夾,而你的上傳文件夾upload_to=“avatar', 那么你上傳的文件會自動存儲到/media/avatar/文件夾。

class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=’avatar’, verbose_name='頭像')

如果你的文件名是sky.jpg, 那么圖片上傳后數據庫中的avatar字段為avatar/sky.jpg, 該字段指向圖片對象,而非絕對路徑。要在模板中使用該圖片,應該使用avatar.url (即/media/avatar/sky.jpg)。

但在實際應用中,請千萬別這么做。這里有2個嚴重問題。

所有用戶都把頭像上傳到了同一個avatar文件夾了 原文件名是什么,那么新文件名就是什么

試想用戶很多,很可能發生文件重名問題,造成后來用戶上傳的文件把前面用戶上傳的頭像覆蓋了,造成了用戶A掛用戶B頭像的狀況。

正確的做法是動態定義上傳路徑,把圖片存儲到用戶自己的文件夾下,并對其重命名。如下圖所示。這樣圖片就會保存在/media/1/avatar/里了,而且文件以uuid命名。

from django.db import modelsfrom django.contrib.auth.models import Userimport uuid # Create your models here. def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:8], ext) # return the whole path to the file return '{0}/{1}/{2}'.format(instance.user.id, 'avatar', filename) class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=user_directory_path, verbose_name='頭像')

上述案例顯然還有一個問題,不同系統路徑分隔符/和是不一樣的,為保證代碼在不同系統中能重用,更好的方式是使用python的os模塊來拼接路徑。如下圖所示。

from django.db import modelsfrom django.contrib.auth.models import Userimport uuidimport os # Create your models here. def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) # return the whole path to the file return os.path.join(instance.user.id, 'avatar', filename) class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=user_directory_path, verbose_name='頭像')

用戶上傳文件可能是圖片,也可能是pdf文件,我們如何把它們放在同一用戶的不同文件夾下呢?實現這個很簡單,如下圖所示。

def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:8], ext) sub_folder = ’file’ if ext.lower() in ['jpg', 'png', 'gif']: sub_folder = 'avatar' if ext.lower() in ['pdf', 'docx']: sub_folder = 'document' return os.path.join(instance.user.id, sub_folder, filename)

方法2: 在視圖中自定義上傳圖片或文件路徑

方法1最簡單直白,但有一個較大缺陷,文件上傳后未經處理就直接存儲了。假如用戶上傳了圖片,我們希望先對其壓縮或裁剪,然后再存儲,或者我們不希望上傳圖片或文件到默認的路徑,這時我們就有必要在視圖中自定義圖片或文件路徑了。例子如下。

@login_requireddef ajax_avatar_upload(request): user = request.user user_profile = get_object_or_404(UserProfile, user=user) if request.method == 'POST': form = AvatarUploadForm(request.POST, request.FILES) if form.is_valid(): img = request.FILES[’avatar_file’] # 獲取上傳圖片 cropped_avatar = crop_image(img, user.id) user_profile.avatar = cropped_avatar # 將圖片路徑修改到當前會員數據庫 user_profile.save() return HttpResponseRedirect(reverse(’myaccount:profile’)) def crop_image(file, uid): # 隨機生成新的圖片名,自定義路徑。 ext = file.name.split(’.’)[-1] file_name = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) cropped_avatar = os.path.join(uid, 'avatar', file_name) # 相對根目錄路徑 file_path = os.path.join('media', uid, 'avatar', file_name) # 裁剪圖片,壓縮尺寸為200*200。 img = Image.open(file) crop_im = img.crop((50,50,300, 300)).resize((200, 200), Image.ANTIALIAS) crop_im.save(file_path) return cropped_avatar

到此這篇關于詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式的文章就介紹到這了,更多相關Django 上傳路徑內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
主站蜘蛛池模板: 亚洲在线播放视频 | 日本一在线中文字幕天堂 | 91.久久| 可以免费观看欧美一级毛片 | 国产成人毛片精品不卡在线 | 国产在线更新 | 女人张开腿给男人桶爽免费 | 97青娱国产盛宴精品视频 | 久久精品一区二区国产 | 一本色道久久爱88av | 久久欧美精品欧美九久欧美 | 久久黄色视屏 | 精品欧美一区二区三区四区 | 夜色成人免费观看 | 欧美日韩精品一区二区三区视频在线 | 免费一级网站 | 久久怡红院亚欧成人影院 | 欧美一级爱操视频 | 国产做a爰片久久毛片 | 免费在线观看亚洲 | 国产成人精品一区二区不卡 | 97香蕉久久夜色精品国产 | 久久久久久久国产精品视频 | 综合久久91| 日韩美女免费线视频 | 三级毛片网 | 国产在线91区精品 | 在线视频三区 | 全部孕妇毛片丰满孕妇孕交 | 亚洲精品一区专区 | 国模肉肉人体大尺度啪啪 | 精品视频一区二区三区在线观看 | 美女张开腿给男人桶 | 国产精品免费久久 | 美女一级ba大片免色野外 | 成人国产网站v片免费观看 成人国产午夜在线视频 | 色一情| 久草综合网 | 草草草在线视频 | 免费国内精品久久久久影院 | 99久9在线视频 |