为什么80%的码农都做不了架构师?>>>   

初始方法一:

疑虑:model使用upload_to自定义路径方法失效,指定路径也失效。最后以Views中指定MEDIA_URL和MEDIA_ROOT做拼接,并且自行判断并建立文件夹,手动chunk保存。不完美的解决。

model:    看avatar字段的upload_to

import uuid
from django.db import models
from django.contrib.auth.models import AbstractUserclass SysUser(AbstractUser):"""用户扩展表,用于替换auth的user类,并添加头像和昵称。"""uid = models.BigAutoField(primary_key=True)nickname = models.CharField(max_length=32, verbose_name="昵称")# 使用 models.ImageField 需要安装 Pillow ,cmd命令:pip install Pillowavatar = models.ImageField(verbose_name="头像", upload_to="avatar11")class Meta:# 数据库显示的表名db_table = "sys_user"

form:

from django.forms import Form
from django.forms import widgets
from django.forms import fieldsclass EditUserForm(Form):"""..."""e_avatar = fields.ImageField(required=False,widget=widgets.FileInput(attrs={"hidden": "hidden"}))"""..."""

Views:

def upload_user_avatar(request):"""用户上传头像操作"""if request.method == "POST":user_id = request.user.uid        # 只是当前登录用户ret = {'state': True, 'error': None, 'data': None}# user_id = request.POST.get("uid", None)avatar = request.FILES.get("avatar", None)# 如果文件夹不存在,则建立dir_path = os.path.join(MEDIA_ROOT, "users", "{}_{}".format(request.user.uid, request.user.username), "avatar")if not os.path.exists(os.path.join(dir_path)):os.makedirs(os.path.join(dir_path))avatar_path = os.path.join(dir_path, avatar.name)try:with open(avatar_path, 'wb+') as img:for chunk in avatar.chunks():img.write(chunk)print("文件接收成功")img_url = os.path.join("users", "{}_{}".format(request.user.uid, request.user.username), "avatar")SysUser.objects.filter(uid=user_id).update(avatar=img_url)ret["data"] = "头像更新成功"except Exception as e:ret["state"] = Falseret["data"] = "头像更新失败,请确认图片格式"print(e)return HttpResponse(json.dumps(ret))

html:

<div class="form-group text-center"><label>{# request.user.avatar  是读取实例的avatar字段,也就是不加MEDIA_URL前缀的 #}{# request.user.avatar.url  是读取实例的avatar字段了,并且添加MEDIA_URL作为前缀的 #}<img id="avatar-img" src="{{ request.user.avatar.url }}" width="200px" height="200px">{{ edit_user_form.e_avatar }}</label>
</div>
  • SysUser.objects.filter(uid=user_id).update(avatar=img_url)
  • 这句话执行结束后,只保存文件名,无法使用upload_to指定的路径。
  • 页面加载时,直接使用拼接后路径。

初始方法二:

TMD,一个保存方式的问题,竟然能啰啰嗦嗦这么久。以后以此方法操作。

model:不变

views:

def upload_user_avatar(request):"""用户上传头像操作"""if request.method == "POST":user_id = request.user.uid        # 只是当前登录用户ret = {'state': True, 'error': None, 'data': None}avatar = request.FILES.get("avatar", None)try:user_obj = SysUser.objects.filter(uid=user_id).first()user_obj.avatar = avataruser_obj.save()ret["data"] = "头像更新成功"except Exception as e:ret["state"] = Falseret["data"] = "头像更新失败,请确认图片格式"print(e)return HttpResponse(json.dumps(ret))
  • user_obj.save()
  • 使用这种保存方式的好处:
  1. 会自动保存文件路径到数据库
  2. 会自动保存文件到指定路径
  3. 必要时会自动创建目录。

目前最终方法:

model:

import uuid
import os
from django.db import models
from django.contrib.auth.models import AbstractUser
"""
python-cmd : makemigrations
python-cmd : migrate
"""def user_directory_path(instance, filename):"""用户上传文件时的自定义操作"""ext = filename.split('.')[-1]                           # 获取上传的文件名的后缀filename = '{0}.{1}'.format(uuid.uuid4().hex[:8], ext)  # 修改文件名,谨防重名。(文档说重名后,会自动增加后缀)sub_folder = 'avatar'# 日后如果对上传文件的类型进行归档时可以COPY这个做参考。# if ext.lower() in ["jpg", "png", "gif", "ico"]:#    sub_folder = "avatar"# if ext.lower() in ["pdf", "docx"]:#     sub_folder = "document"return os.path.join("users", "%s-%s" % (instance.user.uid, instance.user.username), sub_folder, filename)class SysUser(AbstractUser):"""用户扩展表,用于替换auth的user类,并添加头像和昵称。"""uid = models.BigAutoField(primary_key=True)nickname = models.CharField(max_length=32, verbose_name="昵称")# 使用 models.ImageField 需要安装 Pillow ,cmd命令:pip install Pillowavatar = models.ImageField(verbose_name="头像", upload_to=user_directory_path)class Meta:# 数据库显示的表名db_table = "sys_user"

form:

from django.forms import Form
from django.forms import widgets
from django.forms import fieldsclass EditUserForm(Form):"""..."""e_avatar = fields.ImageField(required=False,widget=widgets.FileInput(attrs={"hidden": "hidden"}))"""页面操作该元素时,使用的ajax方式,所以仅对此项进行操作。未使用EditUserForm做验证等操作。""""""..."""

views:

def upload_user_avatar(request):"""用户上传头像操作"""if request.method == "POST":user_id = request.user.uid        # 只是当前登录用户ret = {'state': True, 'error': None, 'data': None}# user_id = request.POST.get("uid", None)   # 如果以后有需求修改其他人的信息时,再从页面获取。avatar = request.FILES.get("avatar", None)try:user_obj = SysUser.objects.filter(uid=user_id).first()user_obj.avatar = avataruser_obj.save()ret["data"] = "头像更新成功"except Exception as e:ret["state"] = Falseret["data"] = "头像更新失败,请确认图片格式"print(e)return HttpResponse(json.dumps(ret))

html:

<div class="form-group text-center"><label>{# request.user.avatar  是读取实例的avatar字段,也就是不加MEDIA_URL前缀的 #}{# request.user.avatar.url  是读取实例的avatar字段了,并且添加MEDIA_URL作为前缀的 #}<img id="avatar-img" src="{{ request.user.avatar.url }}" width="200px" height="200px">{{ edit_user_form.e_avatar }}</label>
</div>

JS:

// 上传文件按钮(label里的图片)点击事件
$('#id_e_avatar').on('change',function () {// 文件上传之前在本地加载预览。{// 获取用户最后一次选择的图片var choose_file=$(this)[0].files[0];// 创建一个新的FileReader对象,用来读取文件信息var reader=new FileReader();// 读取用户上传的图片的路径reader.readAsDataURL(choose_file);// 读取完毕之后,将图片的src属性修改成用户上传的图片的本地路径reader.onload=function () {$("#avatar-img").attr("src",reader.result)}}// 使用FormData格式,将文件上传至服务器formdata = new FormData();//formdata.append('uid',$('#id_e_id').val());formdata.append("avatar",$("#id_e_avatar")[0].files[0]);$.ajax({type: "POST",url: "/account/upload_user_avatar",data:formdata,processData:false,  //上传文件时需要如此设置1contentType:false,    //上传文件时需要如此设置2success:function (data) {data = JSON.parse(data);console.log(data);alert(data.data)  // 偷懒了,哈哈}});
});

media_url映射:

from django.urls import path, re_path, include
from django.views.generic.base import RedirectView
from django.views.static import serve    # 映射media_root路径,可以通过浏览器访问的操作-1
from django.contrib.auth.decorators import login_required
from WXH_DJANGOWEB import settings
from utils.required import requiredurlpatterns = [path('account/', include("account.urls")),path('blog/', include("blog.urls")),re_path(r"^media/(?P<path>.*)$", serve, {"document_root": settings.MEDIA_ROOT, })# 映射media_url,可以通过浏览器访问的操作-2
]

至此,记录完毕。回家吃饭。坑爹的保存方式…… 愿同志们绕坑而行,用不遇坑。

转载于:https://my.oschina.net/asktao/blog/3004672

Django 图片上传upload_to路径指定失效的问题记录相关推荐

  1. nodeJs中间件Multer详解_使用express实现本地文件/图片上传到服务器指定目录

    最终实现的效果,更改Input的值后,将图片显示出来.输入描述信息,提交后,图片上传到后台对应的路径下. Multer Multer 是一个node.js中间件,用于处理 multipart/form ...

  2. 百度富文本编辑器,改变图片上传存储路径

    我用的是最新版! 找到以下2个关键文件: YourPath.../Ueditor/php/config.json YourPath.../Ueditor/php/Uploader.class.php ...

  3. 链接ftp,把文件或图片上传到ftp指定的文件夹中

    /******************************************************************** *  * * Filename : .java * Auth ...

  4. html上传图片至数据库,Django 图片上传到数据库 并调用显示

    环境:Django2.0 Python3.6.4 建立项目,数据库设置,就不说了. 直接上代码: 在models.py中,需要建立模型,这里使用了ImageField字段,用来存储图片路径,这个字段继 ...

  5. Django 图片上传

    1.django上传图片,主要是将图片存储在内存或者临时文件中.所以,上传图片,就是将图片的路径存储在数据库中. 1.图片大小不大于2.5M时,存储在内存. 2.图片大小大于2.5M时,存储在临时文件 ...

  6. django图片上传到oss_django 配置阿里云OSS存储media文件的例子

    1. 安装django-aliyun-oss2-storage包 linux上用 pip install django-aliyun-oss2-storage 无报错,顺利安装 windows上报错: ...

  7. tomcat实现图片上传存放在指定硬盘中

    存放在项目路径里? 有少量图片或者是样式图片存放在项目路径里是没有问题的,如果涉及到图片是用户上传的,存放在项目里面就是不合理的.原因:1.图片多了存放在tomcat路径下,影响tomcat启动与运行 ...

  8. django图片上传到oss_Django上传文件

    继前文的项目准备中,涉及到上传歌曲,所以有了这一过程,在项目目录下设置了资源文件夹暂存歌曲,完场云端上传后即删除所有文件 上传表单 主要设置了上传提交两个选项,定义了上传属性,方便后续获取到文件对象, ...

  9. Python Django 图片上传及显示代码示例

最新文章

  1. 和csm_假面骑士ooo十周年纪念向csm周边 核心硬币和收纳盒再版
  2. C# 读取TXT文本数据 添加到数据库
  3. 台安变频器n2按键说明_台安N2变频器说明书.pdf
  4. VulnHub靶机系列:Os-ByteSec
  5. 关于代码反射能力的哲学思考
  6. huffman图像编码C语言,Huffman编码的c语言实现
  7. Web中树形数据(层级关系数据)的实现—以行政区树为例
  8. mysql group by cube_SparkSQL 中group by、grouping sets、rollup和cube方法详解
  9. web通用组件+Axure原型+Axure元件库+Axure后台管理系统框架模板+大屏数据可视化元件库+智慧社区管理系统大屏+图表组件+表单组合+智慧数据看板+通用大屏图表原件库+电脑端常用组件
  10. pop3 c语言,VisualC#编写实现POP3的程序
  11. excel 中vb组合框_Excel 2013中的工作表组合框问题
  12. img标签图片居中显示
  13. hp 服务器 阵列卡信息导入,HP Proliant系列服务器 配置阵列卡过程.doc
  14. Win32计算器:输入出生年月日,输出周岁,星座以及距离下一次生日的天数
  15. 职高计算机专业的课后总结,职业高中教师教学工作总结
  16. xshell 连接报错 Disconnected from remote host
  17. OpenGl法向量计算
  18. 苹果几是双卡双待_iPhoneSE将于4月24日开卖:苹果A13+双卡双待,网友:等到了!...
  19. 华硕Eee PC 1001HA拆机指南 如何拆机,看这里
  20. IEEE 会议论文PDF eXpress 检查报错“Font Helvetica-Bold, TimesNewRomanPS-BoldMT, ..., is not embedded”

热门文章

  1. 【go】sdk + idea-plugin 开发工具安装
  2. SURF与SIFT比较分析
  3. binutils工具集用法
  4. 使用ecshop电子商务系统的100个小问题
  5. C#操作Excel导入导出
  6. 将文本随意插入网页表单的 textarea
  7. ASP.NET中使用多个runat=server form
  8. 如何定制一款12306抢票浏览器——完结篇
  9. 程序员的自我修养--链接、装载与库笔记:运行库
  10. oracle schema与mysql_Oracle数据库之Oracle 11g R2 用户与模式(schema)