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脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
python奇偶行分开存储实现代码
Mar 19 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
Python创建字典的八种方式
Feb 27 Python
Python中psutil的介绍与用法
May 02 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Python 虚拟环境工作原理解析
Dec 24 Python
再谈python_tkinter弹出对话框创建
Mar 20 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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中cookies使用指南
2007/03/16 PHP
php microtime获取浮点的时间戳
2010/02/21 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
javascript中的数据类型检测方法详解
2019/08/07 Javascript
[34:47]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第一场 11.18
2020/11/18 DOTA
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
如何安装ruby on rails
2014/02/09 面试题
公司前台接待岗位职责
2013/12/03 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
安全生产实施方案
2014/02/23 职场文书
法律专业求职信
2014/05/24 职场文书
财务负责人任命书
2014/06/06 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
八年级英语教学计划
2015/01/23 职场文书
创建文明城市倡议书
2015/04/28 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
oracle数据库去除重复数据
2022/05/20 Oracle