电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:109日期: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
相關文章:
主站蜘蛛池模板: 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 气力输送设备_料封泵_仓泵_散装机_气化板_压力释放阀-河南锐驰机械设备有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 西安中国国际旅行社(西安国旅) | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 家庭教育吧-在线家庭教育平台,专注青少年家庭教育 | 航空连接器,航空插头,航空插座,航空接插件,航插_深圳鸿万科 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 新车测评网_网罗汽车评测资讯_汽车评测门户报道 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 合金耐磨锤头_破碎机锤头_郑州市德勤建材有限公司 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 合金ICP光谱仪(磁性材料,工业废水)-百科 | 注塑_注塑加工_注塑模具_塑胶模具_注塑加工厂家_深圳环科 | 100_150_200_250_300_350_400公斤压力空气压缩机-舰艇航天配套厂家 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 深圳市东信高科自动化设备有限公司|