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脚本实现集群检测和管理功能
Mar 06 Python
Python中分数的相关使用教程
Mar 30 Python
python检测是文件还是目录的方法
Jul 03 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
PyCharm在win10的64位系统安装实例
Nov 26 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Django用户认证系统 组与权限解析
Aug 02 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
TensorFLow 数学运算的示例代码
Apr 21 Python
Python API 操作Hadoop hdfs详解
Jun 06 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中extract()函数的定义和用法
2012/08/17 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
php封装的mysqli类完整实例
2016/10/18 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
Swoole扩展的6种模式深入详解
2021/03/04 PHP
IE/FireFox具备兼容性的拖动代码
2007/08/13 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
js实现快速分享功能(你的文章分享工具)
2013/06/25 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
微信小程序实战之自定义toast(6)
2017/04/18 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
python查找第k小元素代码分享
2013/12/18 Python
python基础教程之常用运算符
2014/08/29 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
戴森英国官网:Dyson英国
2019/05/07 全球购物
美发店5.1活动方案
2014/01/24 职场文书
《春雨》教学反思
2014/04/24 职场文书
班主任对学生的评语
2014/04/26 职场文书
教师评语大全
2014/04/28 职场文书
活动总结书
2014/05/08 职场文书
婚前保证书范文
2015/02/28 职场文书
入党申请书怎么写?
2019/06/21 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
flex弹性布局详解
2022/03/20 HTML / CSS