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中datetime常用时间处理方法
Jun 15 Python
python实现计算倒数的方法
Jul 11 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
python中返回矩阵的行列方法
Apr 04 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
Python接口测试环境搭建过程详解
Jun 29 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
如何通过安装HomeBrew来安装Python3
Dec 23 Python
python数字图像处理:图像简单滤波
Jun 28 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
JAVA/JSP学习系列之六
2006/10/09 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
React手稿之 React-Saga的详解
2018/11/12 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
Python 函数基础知识汇总
2018/03/09 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python subprocess库的使用详解
2018/10/26 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
银行服务明星推荐材料
2014/05/29 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python