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 26 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python安装scipy的步骤解析
Sep 28 Python
python 实现视频 图像帧提取
Dec 10 Python
Python操作Sqlite正确实现方法解析
Feb 05 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
python 用opencv实现图像修复和图像金字塔
Nov 27 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
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
我的论坛源代码(六)
2006/10/09 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
php实现微信小程序授权登录功能(实现流程)
2019/11/13 PHP
js 效率组装字符串 StringBuffer
2009/12/23 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
Vue实现6位数密码效果
2018/08/18 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
python中的print()输出
2019/04/12 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Django中FilePathField字段的用法
2020/05/21 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
CSS3 clip-path 用法介绍详解
2018/03/01 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
Quiksilver荷兰官方网站:冲浪和滑雪板
2019/11/16 全球购物
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
商家认证委托书格式
2014/10/16 职场文书
会计求职简历自我评价
2015/03/10 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
导游词之包公祠
2019/11/25 职场文书
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL