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 10 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python中%r和%s的详解及区别
Mar 16 Python
python 在屏幕上逐字显示一行字的实例
Dec 24 Python
python 实现返回一个列表中出现次数最多的元素方法
Jun 11 Python
Ubuntu+python将nii图像保存成png格式
Jul 18 Python
python基于property()函数定义属性
Jan 22 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
python 数据库查询返回list或tuple实例
May 15 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
python设置中文界面实例方法
Oct 27 Python
用python制作个音乐下载器
Jan 30 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中的string类型使用说明
2010/07/27 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
PHP里的单例类写法实例
2015/06/25 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
使用ExtJS技术实现的拖动树结点
2010/08/05 Javascript
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
解决cordova+vue 项目打包成APK应用遇到的问题
2019/05/10 Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
2020/07/26 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
python获取list下标及其值的简单方法
2016/09/12 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
python flask安装和命令详解
2019/04/02 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Django URL参数Template反向解析
2020/11/24 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
J2EE相关知识面试题
2013/08/26 面试题
个人应聘自我评价分享
2013/11/18 职场文书
英语演讲稿范文
2014/01/03 职场文书
高三历史教学反思
2014/01/09 职场文书
个人授权委托书样本
2014/09/13 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电