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基础教程之循环介绍
Aug 29 Python
Python入门篇之字符串
Oct 17 Python
Python中的多重装饰器
Apr 11 Python
详解Python中break语句的用法
May 14 Python
在Django的URLconf中使用命名组的方法
Jul 18 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
python程序 创建多线程过程详解
Sep 23 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
Python使用Kubernetes API访问集群
May 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实现框架(二)
2006/10/09 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
在vue项目中正确使用iconfont的方法
2018/09/28 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
vant中的toast层级改变操作
2020/11/04 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
Python中unittest用法实例
2014/09/25 Python
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python字符串的一些操作方法总结
2019/06/10 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
法学专业毕业生自荐信范文
2013/12/18 职场文书
教师个人自我鉴定
2014/02/08 职场文书
保护环境的建议书
2014/03/12 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
2014年绩效考核工作总结
2014/12/11 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Python实现双向链表基本操作
2022/05/25 Python