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 19 Python
python实现类的静态变量用法实例
May 08 Python
Python中的字符串替换操作示例
Jun 27 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
Jan 29 Python
python读取大文件越来越慢的原因与解决
Aug 08 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
python实现简单的购物程序代码实例
Mar 03 Python
Python使用pdb调试代码的技巧
May 03 Python
套娃式文件夹如何通过Python批量处理
Aug 23 Python
python实现手机推送 代码也就10行左右
Apr 12 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
2013/07/05 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
jQuery 标题的自动翻转实现代码
2009/10/14 Javascript
brook javascript框架介绍
2011/10/10 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
Python获取文件ssdeep值的方法
2014/10/05 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
2018/06/09 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
代码详解django中数据库设置
2019/01/28 Python
使用python远程操作linux过程解析
2019/12/04 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
vue常用指令代码实例总结
2020/03/16 Python
django实现日志按日期分割
2020/05/21 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
Ajax主要包含了哪些技术
2014/06/12 面试题
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
《影子》教学反思
2014/02/21 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
村干部培训方案
2014/05/02 职场文书
学校领导班子对照检查材料
2014/08/28 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript