Django处理文件上传File Uploads的实例


Posted in Python onMay 28, 2018

HttpRequest.FILES

表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data

<form enctype="multipart/form-data" method="post" action="/foo/">
<input type="file" name="image" />

request.FILES中的键来自于表单中的<input type="file" name="" />的name值:

img=request.FILES['image']

request.FILES中的值均为UploadedFile类文件对象。

UploadedFile

UploadedFile是类文件对象,具有以下方法和属性:

UploadedFile.read()

读取整个上传文件的数据,文件较大时慎用。

UploadedFile.multiple_chunks(chunk_size=None)

判断文件是否足够大,一般为2.5M

UploadedFile.chunks(chunk_size=None)

返回一个生成器对象,当multiple_chunks()为True时应该使用这个方法来代替read().

UploadedFile.name

上传文件的name。

UploadedFile.size

上传文件的大小。

UploadedFile.content_type

上传文件时的content_type报头,例如(e.g. text/plain or application/pdf).

UpladedFile.charset

编码

存储文件

想将上传的文件存储在本地时:

f=request.FILES['image']
with open('some/file/name.txt', 'wb+') as destination:
 for chunk in f.chunks():
  destination.write(chunk)

使用Form处理上传文件

也可以使用django自带的form来处理上传文件。

先创建带FileFiled或者ImageFiled的Form:

# In forms.py...
from django import forms
 
class UploadFileForm(forms.Form):
 title = forms.CharField(max_length=50)
 file = forms.FileField()

用Form处理:

>>> f =UploadFileFormt(request.POST, request.FILES)

view函数:

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from .forms import UploadFileForm
 
def handle_uploaded_file(f):
 with open('some/file/name.txt', 'wb+') as destination:
  for chunk in f.chunks():
   destination.write(chunk)
 
def upload_file(request):
 if request.method == 'POST':
  form = UploadFileForm(request.POST, request.FILES)
  if form.is_valid():
   handle_uploaded_file(request.FILES['file'])
   return HttpResponseRedirect('/success/url/')
 else:
  form = UploadFileForm()
 return render_to_response('upload.html', {'form': form})

使用Model处理上传文件

如果创建了一个带FileField或者ImageField域的Model,需要将上传文件存储到Model的FileFIeld域。

比如,使用nicEdit文本编辑器时,需要存储上传的文件,建立Model:

from django.db import models
 
class NicEditImage(models.Model):
 image = models.ImageField(upload_to='nicedit/%Y/%m/%d')

创建ModelForm:

from django import forms
 
class NicEditImageForm(forms.ModelForm):
 class Meta:
  model = NicEditImage

view:

def upload(request):
 if not request.user.is_authenticated():
  json = simplejson.dumps({
   'success': False,
   'errors': {'__all__': 'Authentication required'}})
  return HttpResponse(json, mimetype='application/json')
 form = NicEditImageForm(request.POST or None, request.FILES or None)
 if form.is_valid():
  image = form.save() #保存Form和Model
  json = simplejson.dumps({
   'success': True,
   'upload': {
    'links': {
     'original': image.image.url},
    'image': {
     'width': image.image.width,
     'height': image.image.height}
   }
  })
 else:
  json = simplejson.dumps({
   'success': False, 'errors': form.errors})
 return HttpResponse(json, mimetype='application/json')

当然也可以手动存储文件到Model的文件域:

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField
 
def upload_file(request):
 if request.method == 'POST':
  form = UploadFileForm(request.POST, request.FILES)
  if form.is_valid():
   instance = ModelWithFileField(file_field=request.FILES['file']) #保存文件到FileField域
   instance.save()
   return HttpResponseRedirect('/success/url/')
 else:
  form = UploadFileForm()
 return render(request, 'upload.html', {'form': form})

不使用Form处理

想获得更大自由度时,可以全手动处理。

from django.db import models
 
class Car(models.Model):
 name = models.CharField(max_length=255)
 price = models.DecimalField(max_digits=5, decimal_places=2)
 photo = models.ImageField(upload_to='cars')

Model的FileField有以下属性:

>>> car = Car.objects.get(name="57 Chevy")
>>> car.photo
<ImageFieldFile: chevy.jpg>
>>> car.photo.name
u'cars/chevy.jpg'
>>> car.photo.path
u'/media/cars/chevy.jpg'
>>> car.photo.url
u'http://media.example.com/cars/chevy.jpg'

Model的FileField是一个File对象,除了具有File对象的各种方法外,还有一个额外的save()方法:

FieldFile.save(name, content, save=True)

name为存储名字,content为File或者File子类的实例

>>> car.photo.save('myphoto.jpg', content, save=False)
>>> car.save()

类似于

>>> car.photo.save('myphoto.jpg', content, save=True)

手动存储:

from django.core.files.base import ContentFile
photo=request.FILES.get('photo','')
if photo: 
 file_content = ContentFile(photo.read()) #创建File对象
 car.photo.save(photo.name, file_content) #保存文件到car的photo域
 car.save()

以上这篇Django处理文件上传File Uploads的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的金山快盘的签到程序
Jan 17 Python
图文详解WinPE下安装Python
May 17 Python
Tornado 多进程实现分析详解
Jan 12 Python
python 连接各类主流数据库的实例代码
Jan 30 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
程序员写Python时的5个坏习惯,你有几条?
Nov 26 Python
彻底理解Python中的yield关键字
Apr 01 Python
Python自定义一个异常类的方法
Jun 27 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
pytorch 权重weight 与 梯度grad 可视化操作
Jun 05 Python
python3.4实现邮件发送功能
May 28 #Python
解决Django的request.POST获取不到内容的问题
May 28 #Python
Django后台获取前端post上传的文件方法
May 28 #Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 #Python
浅析Python装饰器以及装饰器模式
May 28 #Python
Python装饰器知识点补充
May 28 #Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 #Python
You might like
php文件上传的例子及参数详解
2013/12/12 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
php加密解密字符串示例
2016/10/13 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
JavaScript 模拟用户单击事件
2009/12/31 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
理解Javascript_02_理解undefined和null
2010/10/11 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
Jquery的autocomplete插件用法及参数讲解
2019/03/12 jQuery
vue实现移动端input上传视频、音频
2020/08/18 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
pyQt5实时刷新界面的示例
2019/06/25 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
Django中FilePathField字段的用法
2020/05/21 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
2021/03/03 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
介绍一下javax.servlet.Servlet接口及其主要方法
2015/11/30 面试题
关于祖国的演讲稿
2014/05/04 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python