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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
跟老齐学Python之坑爹的字符编码
Sep 28 Python
Python中input与raw_input 之间的比较
Aug 20 Python
用pandas按列合并两个文件的实例
Apr 12 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python实现批量文件重命名
Oct 31 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
Python @property及getter setter原理详解
Mar 31 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
5道关于python基础 while循环练习题
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
php网站被挂木马后的修复方法总结
2014/11/06 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
javascript 动态加载 css 方法总结
2009/07/11 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
Javascript简单改变表单元素背景的方法
2015/07/15 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
2018/04/24 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
Python中字典映射类型的学习教程
2015/08/20 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
详解python字节码
2018/02/07 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
销售员个人求职的自我评价
2014/02/10 职场文书
文秘个人求职信范文
2014/04/22 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
ajax请求前端跨域问题原因及解决方案
2021/10/16 Javascript
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android