`

Django处理文件上传File Uploads

阅读更多

       

Django处理文件上传File Uploads

 

HttpRequest.FILES

表单上传的文件对象存储在类字典对象request.FILES中,表单格式需为multipart/form-data

1
2
<form enctype="multipart/form-data" method="post" action="/foo/">
<input type="file" name="image" />

request.FILES中的键来自于表单中的<input type="file" name="" />的name值:

1
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

编码

存储文件

想将上传的文件存储在本地时:

1
2
3
4
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:

1
2
3
4
5
6
# In forms.py...
from django import forms
 
class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

用Form处理:

1
>>> f =UploadFileFormt(request.POST, request.FILES)

view函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:

1
2
3
4
from django.db import models
 
class NicEditImage(models.Model):
    image = models.ImageField(upload_to='nicedit/%Y/%m/%d')

创建ModelForm:

1
2
3
4
5
from django import forms
 
class NicEditImageForm(forms.ModelForm):
    class Meta:
        model = NicEditImage

view:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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的文件域:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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处理

想获得更大自由度时,可以全手动处理。

1
2
3
4
5
6
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有以下属性:

1
2
3
4
5
6
7
8
9
>>> 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

Model的FileField是一个File对象,除了具有File对象的各种方法外,还有一个额外的save()方法:

FieldFile.save(name, content, save=True)

 name为存储名字,content为File或者File子类的实例

1
2
>>> car.photo.save('myphoto.jpg', content, save=False)
>>> car.save()

类似于

1
>>> car.photo.save('myphoto.jpg', content, save=True)

手动存储:

1
2
3
4
5
6
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的实例

    在Web开发中,文件上传是一个常见的功能需求,而在Python的Django框架中处理文件上传则是开发者必备的技能之一。本文将详细介绍如何使用Django框架处理文件上传,并给出具体的代码示例和操作步骤。 首先,要处理...

    django实现文件上传并显示的简单例子

    在本文中,我们将深入探讨如何...这个例子展示了Django模型、表单、视图和模板的基本用法,以及处理文件上传时的注意事项。通过扩展这个基础,你可以构建更复杂的应用,如添加文件预览、权限控制和多文件上传等功能。

    Django2 文件上传及下载功能(支持中文名文件)python3.7

    `upload_file`视图处理文件上传,如果表单验证成功,将文件保存到数据库。`download_file`视图根据提供的主键(pk)获取文件模型对象,然后构建一个响应,设置内容类型和附件头,允许浏览器以文件形式下载。 最后,...

    Django文件上传

    创建视图函数来处理文件上传。在`fileupload/views.py`中: ```python from django.shortcuts import render, redirect from .models import FileUpload def upload_file(request): if request.method == 'POST' ...

    django 上传文件

    现在,我们需要创建一个表单(Form)来处理文件上传。在 `uploadapp/forms.py` 文件中: ```python from django import forms class UploadFileForm(forms.Form): file = forms.FileField() ``` 接下来,我们要...

    django 连接数据库、上传文件

    在Python的Web开发框架Django中,连接数据库和处理文件上传是两个重要的功能。下面将详细阐述这两个主题。 首先,让我们来谈谈如何在Django中连接MySQL数据库。Django默认使用SQLite数据库,但通过配置可以方便地...

    10分钟入手django

    在模型中,我们可以使用FileField或ImageField来处理文件上传。例如: ```python from django.db import models class UploadModel(models.Model): file = models.FileField(upload_to='uploads/') ``` 在视图中...

    django页面版网盘

    - **文件上传(File Uploads)**:Django提供了处理文件上传的功能,开发者可以设置存储策略,例如本地存储或云存储服务。 - **文件下载(File Downloads)**:视图函数会处理文件下载请求,确保安全地提供文件链接,...

    django实现多文件同时上例子

    在Django中,我们需要创建一个视图函数来处理文件上传的POST请求: ```python from django.shortcuts import render, redirect from .forms import MultiFileUploadForm from .models import UploadedFile def ...

    Django后台获取前端post上传的文件方法

    在Django框架中,处理前端POST请求上传的文件是一个常见的任务。本文将详细介绍如何在Django后台获取并处理这些文件。 ...在创建用于上传文件的表单时,需要在`...希望这个教程对你理解Django处理文件上传有所帮助。

    django复习笔记:一个简单的文件分享系统

    接下来,创建视图函数(views.py)来处理文件的上传和下载。Django的`Form`和`ModelForm`可以用来处理HTTP请求。同时,确保在`urls.py`中设置URL路由,以便用户可以通过特定的URL访问这些功能。 为了允许用户上传...

    Django框架文件上传与自定义图片上传路径、上传文件名操作分析

    除了手动处理文件存储外,Django还提供了内置的存储机制,如`ImageField`和`FileField`。这些字段可以直接从`request.FILES`中获取文件,并自动保存到指定的位置。例如: ```python # models.py from django.db ...

    文件上传例子,upFile

    在服务器端,通常我们会使用一种服务器端编程语言如Node.js(搭配Express框架)、Python(Django或Flask)或Java(Spring Boot)来接收和处理文件。以Node.js为例,我们可以使用Express框架的`multer`中间件来处理...

    WEB_文件的上传与下载思维导图总结及所用的包

    - Flask/Django等Web框架:提供了处理文件上传的API,如Flask的`request.files`或Django的`request.FILES`。 2. 后端处理: - 存储:文件可以临时存储在服务器内存(不推荐,适用于小文件)或直接写入硬盘。推荐...

    django_sound_file:一个用于记录用户语音并将其保存在服务器上的简单项目

    # 处理文件上传逻辑 pass else: return render(request, 'upload.html') ``` 为了接收用户的录音,我们需要在HTML模板(upload.html)中使用HTML5的`&lt;audio&gt;`和`&lt;input type="file"&gt;`元素。`&lt;input type="file...

    Django Admin 上传文件到七牛云的示例代码

    这样,当通过Django Admin界面上传文件时,`MyStorage`类将会接管文件处理过程,将文件上传到七牛云,而不是默认的本地存储位置。 请注意,为了确保生产环境的安全和稳定,你需要在你的`settings.py`文件中设置七...

    django-oss-storage:AliCloud OSS的Django存储后端

    - **自动处理文件名冲突**:当多个用户尝试上传同名文件时,该库会自动生成唯一的文件名,避免冲突。 - **元数据管理**:支持设置和获取OSS对象的元数据,如文件的MIME类型、访问权限等。 - **URL生成**:提供生成...

    文件上传代码

    对于现代浏览器,还可以使用`FileReader` API预览或处理文件,例如读取文件内容、显示缩略图等。 4. 后端处理: 在后端,无论是Node.js、Java、Python还是其他语言,接收文件上传通常涉及解析多部分请求。例如,...

    使用Django框架的简单视频网站后端.zip

    Django提供了处理文件上传的API,可以配置存储位置,如本地文件系统、云存储服务等。在settings.py中,可以设置`MEDIA_ROOT`和`MEDIA_URL`来管理用户上传的媒体文件。 10. 静态文件管理(Static Files): Django...

Global site tag (gtag.js) - Google Analytics