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封装对象实现时间效果
Apr 23 Python
Python yield使用方法示例
Dec 04 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
不可错过的十本Python好书
Jul 06 Python
Python中的元组介绍
Jan 28 Python
PyQt5实现简单数据标注工具
Mar 18 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
python之信息加密题目详解
Jun 26 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
python求质数列表的例子
Nov 24 Python
python 爬取豆瓣网页的示例
Apr 13 Python
pytorch锁死在dataloader(训练时卡死)
May 28 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 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
vue.js单页面应用实例的简单实现
2017/04/10 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
vue axios请求拦截实例代码
2018/03/29 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
JavaScript中判断为整数的多种方式及保留两位小数的方法
2019/09/09 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
手写一个python迭代器过程详解
2019/08/27 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
Shein英国:女性时尚网上商店
2019/04/10 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
学校运动会霸气口号
2014/06/07 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
创业计划书之美甲店
2019/09/20 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python