文档章节

Django处理文件上传File Uploads

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 00:43
字数 792
阅读 7
收藏 0

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'

可以手动修改文件的名称:

>>> import os
>>> from django.conf import settings
>>> initial_path = car.photo.path
>>> car.photo.name = 'cars/chevy_ii.jpg'
>>> new_path = settings.MEDIA_ROOT + car.photo.name
>>> # Move the file on the filesystem
>>> os.rename(initial_path, new_path)
>>> car.save()
>>> car.photo.path
'/media/cars/chevy_ii.jpg'
>>> car.photo.path == new_path
True

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()

  

本文转载自:http://www.cnblogs.com/linxiyue/p/4038436.html

AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
django里面文件上传处理处理

最近,写一个上次文件的django。死活传不过去。 在大神的帮助下面,最终还是成。 不过也发现一个问题: django 官网文档:https://docs.djangoproject.com/en/1.8/topics/http/file-uploads/...

NLGBZJ
2015/09/19
1K
0
Django管理文件

本页文档讲述Django 的文件访问API,例如用户上传的文件。这些底层的API 足够通用以致于你可以用于其它目的。如果你想要处理静态文件(JS、CSS等),参见管理静态文件(CSS和图像)。 默认情...

楠木楠
2016/10/09
742
0
IE uploadify上传图片后不显示,跪求各位大哥!

IE uploadify上传图片后不显示,求高手! 用windows-xp + tomcat6 + myeclipse8.6 写的基于struts的网站,有个上传图片功能,并在其他页面里 显示图片。 可是用IE(包括IE7,IE8)上传成功后,...

雷剑华
2014/10/30
865
2
Django使用Uploadify组件实现图片上传

Uploadify组件上传文件很酷,可以实现文件进度上传,而且可以批量上传各种文件。好处还很多,具体详情登到官网看看文档了解吧。在同类组件中,Uploadify做的也很出色。打算在Django中用它,两...

岭南六少
2011/08/08
2.5K
4
Python 版 APM 服务使用测试

后端开发与云服务 云服务这个词,大概最早是从云盘开始的,那时候概念也特别简单,无非就是把一些数据存在别人的服务器上,在”云存储”这个名词火起来之前,QQ 也有提供网站的功能用来存一些...

Scholer
2015/09/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
12
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部