Django框架文件上传与自定义图片上传路径、上传文件名操作分析


Posted in Python onMay 10, 2019

本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下:

文件上传

1、创建上传文件夹

在static文件夹下创建uploads用于存储接收上传的文件

在settings中配置,

MEDIA_ROOT=os.path.join(BASE_DIR,r'static/uploads')

2、定义上传表单

<form action="{% url 'app:do_upload' %}" 
method="post" enctype="multipart/form-data">

文件数据存储在request.FILES属性中

文件上传必须使用POST请求方式

<form method='post' action='x' enctype='multipart/form-data'>
 {% csrf_token %}
 <input type='file' name='icon'>
 <input type='submit' value='上传'>
<form>

3、手动存储文件

存储到关联用户的表字段中

def savefIcon(request):
if request.method == 'POST'
 f = request.FILES['icon']
 filePath = os.path.join(settings.MEDIA_ROOT,f.name)
 with open(filePath,'wb') as fp:
  for part in f.chunks():
   fp.write(part)

4、django内置存储

  • ImageField
    • 要导入pillow模块
  • FileField
  • 从request.FILES将文件获取出来,直接赋值给字段
  • 存储的时候,数据库存储的是路径
  • 存储在MEDIA_ROOT

自定义图片上传路径和上传文件名

图片上传中,如果不对上传的文件名做处理,很容易引起文件名重复,这会覆盖之前上传的图片,django提供了自定义上传文件名的方法。

def generate_filename(self, instance, filename):
 """
 Apply (if callable) or prepend (if a string) upload_to to the filename,
 then delegate further processing of the name to the storage backend.
 Until the storage layer, all file paths are expected to be Unix style
 (with forward slashes).
 """
 if callable(self.upload_to):
  filename = self.upload_to(instance, filename)
 else:
  dirname = datetime.datetime.now().strftime(self.upload_to)
  filename = posixpath.join(dirname, filename)
 return self.storage.generate_filename(filename)

上面的代码是django中对ImageField上传时,生成文件名的处理方式。如果 upload_to 的参数是可调用的,则直接调用来生成文件名(包括静态文件夹后的文件路径)。要自定义上传文件名就从这里着手。

import uuid
from django.db import models
def image_upload_to(instance, filename):
 return 'original_image/{uuid}/{filename}'.format(uuid=uuid.uuid4().hex, filename=filename)
class TestImageUpload(models.Model):
 image = models.ImageField(upload_to=image_upload_to)

按照上面的方式,就可以按照自己的意愿随意的处理文件名了(函数的参数个数是固定的)。

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之私有函数和专有方法
Oct 24 Python
python避免死锁方法实例分析
Jun 04 Python
Python 实现一个颜色色值转换的小工具
Dec 06 Python
使用Python对SQLite数据库操作
Apr 06 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
搭建python django虚拟环境完整步骤详解
Jul 08 Python
python django 原生sql 获取数据的例子
Aug 14 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
Python如何急速下载第三方库详解
Nov 02 Python
python基础之类方法和静态方法
Oct 24 Python
Django框架实现分页显示内容的方法详解
May 10 #Python
Django框架验证码用法实例分析
May 10 #Python
Python爬虫实现验证码登录代码实例
May 10 #Python
详解如何管理多个Python版本和虚拟环境
May 10 #Python
不到40行代码用Python实现一个简单的推荐系统
May 10 #Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 #Python
Python3列表内置方法大全及示例代码小结
May 10 #Python
You might like
PHP define函数的使用说明
2008/08/27 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
初识Node.js
2014/09/03 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
JS判断数组那点事
2017/10/10 Javascript
vue观察模式浅析
2018/09/25 Javascript
element上传组件循环引用及简单时间倒计时的实现
2018/10/01 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python中set()函数简介及实例解析
2018/01/09 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python使用正则来处理各种匹配问题
2019/12/22 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
RIP版本1跟版本2的区别
2013/12/30 面试题
linux面试题参考答案(4)
2013/01/28 面试题
材料采购员岗位职责
2013/12/17 职场文书
犯错检讨书
2014/02/21 职场文书
材料员岗位职责
2014/03/13 职场文书
低碳环保口号
2014/06/12 职场文书
捐助倡议书
2015/01/19 职场文书
英文感谢信格式
2015/01/21 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
Python数据类型最全知识总结
2021/05/31 Python