Django入门手册04 上传图片并保存路径到数据库展示图片
Posted mengdie1978
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django入门手册04 上传图片并保存路径到数据库展示图片相关的知识,希望对你有一定的参考价值。
-
在
models.py
下加入一行:
upload_to
是在设置好的的media文件夹下再创建users文件夹。
class User(models.Model): """ 创建用户表 """ # ...省略其他属性 # 下面是加入的 avatar = models.ImageField(upload_to=\'users\', max_length=100, blank=True, null=True, verbose_name=\'用户头像\')
2.在settings.py下加入代码,`MEDIA_URL、MEDIA_ROOT`的具体作用在下面官方指南中给出:
#上传图片 # media_confige MEDIA_URL = \'/media/\' MEDIA_ROOT = BASE_DIR / \'static/media\'
3.在模版文件夹下添加add_user_image.html
:
主要是注意enctype=\'multipart/form-data\' method="post"
<form action="% url \'users:upload_handle\'%" enctype=\'multipart/form-data\' method="post"> % csrf_token % <p>选择图片:<input type="file" name="pic"></p> <p><input type="submit" value="上传头像"></p> </form>
4.老样子,urls.py
和views.py
分别写代码:
# 第一行用来转到填表单,第二行用来处理上传来的图片 path(\'add_user_image/\', views.add_user_image, name=\'add_user_image\'), path(\'upload_handle/\', views.upload_handle, name=\'upload_handle\'),
from utils.uploads import getNewName from .models import User from django.conf import settings def add_user_image(request): return render(request, \'users/add_user_image.html\') def upload_handle(request): # 获取一个文件管理器对象 file = request.FILES[\'pic\'] # 保存文件 new_name = getNewName(\'avatar\') # 具体实现在自己写的uploads.py下 # 将要保存的地址和文件名称 where = \'%s/users/%s\' % (settings.MEDIA_ROOT, new_name) # 分块保存image content = file.chunks() with open(where, \'wb\') as f: for i in content: f.write(i) # 上传文件名称到数据库 User.objects.filter(name=\'trent\').update(avatar=new_name) # 返回的httpresponse return HttpResponse(\'ok\')
对了,我在utils文件夹中写了一个uploads.py
。里面有一个生成随机名字的代码,在这里贴出来:
import time import numpy as np def getNewName(file_type): # 前面是file_type+年月日时分秒 new_name = time.strftime(file_type+\'-%Y%m%d%H%M%S\', time.localtime()) # 最后是5个随机数字 # Python中的numpy库中的random.randint(a, b, n)表示随机生成n个大于等于a,小于b的整数 ranlist = np.random.randint(0, 10, 5) for i in ranlist: new_name += str(i) # 加后缀名 new_name += \'.jpg\' # 返回字符串 return new_name
在模型中使用 FileField 或 ImageField (见下文)需要几个步骤:
在你的配置文件中,你需要定义 MEDIA_ROOT 作为你希望 Django 存储上传文件的目录的完整路径。(为了保证性能,这些文件不存储在数据库中。)定义 MEDIA_URL 作为该目录的基本公共 URL。确保这个目录是 Web 服务器的用户账号可以写的。 将 FileField 或 ImageField 添加到你的模型中,定义 upload_to 选项,指定 MEDIA_ROOT 的子目录,用于上传文件。 所有这些将被存储在你的数据库中的是一个文件的路径(相对于 MEDIA_ROOT )。你很可能要使用 Django 提供的方便的 url 属性。例如,如果你的 ImageField 叫做 mug_shot,你可以在模板中使用 object.mug_shot.url 获取图片的绝对路径。 例如,你的 MEDIA_ROOT 设置为 \'/home/media\', upload_to 设置为 \'photos/%Y/%m/%d\'。upload_to 中的 \'%Y/%m/%d\' 部分是 strftime() 格式化,\'%Y\' 是四位数的年,\'%m\' 是两位数的月,\'%d\' 是两位数的日。如果你在 2007 年 1 月 15 日上传了一个文件,它将被保存在 /home/media/photos/2007/01/15 目录下。
如果你想检索上传文件的盘上文件名,或者文件的大小,可以分别使用 name 和 size 属性;关于可用属性和方法的更多信息,请参见 File 类参考和 管理文件 主题指南。
展示图片
参考文献:Django显示图片:MEDIA_ROOT和MEDIA_URL的设置
设置MEDIA_URL和MEDIA_ROOT,如果上面的“上传图片”功能已经实现了那这里已经设置好了
#上传图片 # media_config MEDIA_URL = \'/media/\' MEDIA_ROOT = BASE_DIR / \'static/media\'
在项目Project的urls.py添加代码:
from django.conf.urls.static import static from django.conf import settings urlpatterns = [ path(\'web/\', include(\'web.urls\')), path(\'admin/\', admin.site.urls), ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) # 主要是上面那行
在settings文件中,TEMPLATES中\'context_processors\'
下面新增\'django.template.context_processors.media\'
:
TEMPLATES = [ \'BACKEND\': \'django.template.backends.django.DjangoTemplates\', \'DIRS\': [BASE_DIR / \'templates\'] , \'APP_DIRS\': True, \'OPTIONS\': \'context_processors\': [ # ... # 加下面这行 \'django.template.context_processors.media\', ], , , ]
数据库存储图片路径并显示图片
这几天在做图片的上传和显示,上传时保存图片到文件夹中并将其存储路径保存到数据库里,显示时用数据绑定显示
让此图片控件连接上图片所在的路径
之前在网上收集了相关资料,大多数人表示这个路径应该是绝对路径而不是相对路径,所以一开是存储路径的保存是这样的
但是运行结果是。。。。
这里的头像是无法显示的
后来在学长的帮助下,将存储路径修改为
这是一个相对路径,VS读取数据中从这个“异次元空间”文件夹里开始寻找(也就是从根目录里开始),下属文件夹里images寻找20161124213555917.jpg是成功的,如果像一开始那样的路径是寻找不到的,所以显示为空白
下面是正常运行的结果:
成功!
下面是上传图片的相关代码
1 if (upload1.HasFile)//判断控件是否有文件路径 2 { 3 string filename = upload1.FileName;//取得文件名 4 filename = filename.Substring(filename.LastIndexOf(".") + 1);//取得后缀 5 if (filename.ToLower() == "jpg" || filename.ToLower() == "gif")//判断类型 6 { 7 string img = DateTime.Now.ToString("yyyyMMddHHmmssfff") + "." + filename; 8 upload1.SaveAs(Server.MapPath("images/") + img); 9 string picture = ("images/") + img; 10 //传到根目录的images文件夹+重命名的文件名,也可以用原来的图片的名称,自己定。上传成功; 11 string sql = "insert into tabUsers values(\'" + ID + "\',\'" + name + "\',\'" + hspwd + "\',\'" + sex + "\',\'" + year+ "\',\'"+mail+"\',\'" + question1 + "\',\'" + hsanswer + "\',\'" + picture + "\')"; 12 int result2 = Class.Put(sql); 13 if (result2 == 1) 14 Binddata(); 15 else if (result2 != 1) 16 { 17 Response.Write("<script>alert(\'注册失败!\');</script>"); 18 return; 19 } 20 } 21 else 22 { 23 Response.Write("<script>alert(\'图片格式只支持jpg和gif\');</script>"); 24 return;//提示错误 25 } 26 } 27 else 28 { 29 Response.Write("<script>alert(\'请选相片!\');</script>"); 30 return;//提示错误 31 }
注意里面的“
string picture = ("images/") + img;
” ,保存路径
以上是关于Django入门手册04 上传图片并保存路径到数据库展示图片的主要内容,如果未能解决你的问题,请参考以下文章
Django后台上传的图片前台怎么显示不出来?路径的问题怎样解决?