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()
|
相关推荐
在Web开发中,文件上传是一个常见的功能需求,而在Python的Django框架中处理文件上传则是开发者必备的技能之一。本文将详细介绍如何使用Django框架处理文件上传,并给出具体的代码示例和操作步骤。 首先,要处理...
在本文中,我们将深入探讨如何...这个例子展示了Django模型、表单、视图和模板的基本用法,以及处理文件上传时的注意事项。通过扩展这个基础,你可以构建更复杂的应用,如添加文件预览、权限控制和多文件上传等功能。
`upload_file`视图处理文件上传,如果表单验证成功,将文件保存到数据库。`download_file`视图根据提供的主键(pk)获取文件模型对象,然后构建一个响应,设置内容类型和附件头,允许浏览器以文件形式下载。 最后,...
创建视图函数来处理文件上传。在`fileupload/views.py`中: ```python from django.shortcuts import render, redirect from .models import FileUpload def upload_file(request): if request.method == 'POST' ...
现在,我们需要创建一个表单(Form)来处理文件上传。在 `uploadapp/forms.py` 文件中: ```python from django import forms class UploadFileForm(forms.Form): file = forms.FileField() ``` 接下来,我们要...
在Python的Web开发框架Django中,连接数据库和处理文件上传是两个重要的功能。下面将详细阐述这两个主题。 首先,让我们来谈谈如何在Django中连接MySQL数据库。Django默认使用SQLite数据库,但通过配置可以方便地...
在模型中,我们可以使用FileField或ImageField来处理文件上传。例如: ```python from django.db import models class UploadModel(models.Model): file = models.FileField(upload_to='uploads/') ``` 在视图中...
- **文件上传(File Uploads)**:Django提供了处理文件上传的功能,开发者可以设置存储策略,例如本地存储或云存储服务。 - **文件下载(File Downloads)**:视图函数会处理文件下载请求,确保安全地提供文件链接,...
在Django中,我们需要创建一个视图函数来处理文件上传的POST请求: ```python from django.shortcuts import render, redirect from .forms import MultiFileUploadForm from .models import UploadedFile def ...
在Django框架中,处理前端POST请求上传的文件是一个常见的任务。本文将详细介绍如何在Django后台获取并处理这些文件。 ...在创建用于上传文件的表单时,需要在`...希望这个教程对你理解Django处理文件上传有所帮助。
接下来,创建视图函数(views.py)来处理文件的上传和下载。Django的`Form`和`ModelForm`可以用来处理HTTP请求。同时,确保在`urls.py`中设置URL路由,以便用户可以通过特定的URL访问这些功能。 为了允许用户上传...
除了手动处理文件存储外,Django还提供了内置的存储机制,如`ImageField`和`FileField`。这些字段可以直接从`request.FILES`中获取文件,并自动保存到指定的位置。例如: ```python # models.py from django.db ...
在服务器端,通常我们会使用一种服务器端编程语言如Node.js(搭配Express框架)、Python(Django或Flask)或Java(Spring Boot)来接收和处理文件。以Node.js为例,我们可以使用Express框架的`multer`中间件来处理...
- Flask/Django等Web框架:提供了处理文件上传的API,如Flask的`request.files`或Django的`request.FILES`。 2. 后端处理: - 存储:文件可以临时存储在服务器内存(不推荐,适用于小文件)或直接写入硬盘。推荐...
# 处理文件上传逻辑 pass else: return render(request, 'upload.html') ``` 为了接收用户的录音,我们需要在HTML模板(upload.html)中使用HTML5的`<audio>`和`<input type="file">`元素。`<input type="file...
这样,当通过Django Admin界面上传文件时,`MyStorage`类将会接管文件处理过程,将文件上传到七牛云,而不是默认的本地存储位置。 请注意,为了确保生产环境的安全和稳定,你需要在你的`settings.py`文件中设置七...
- **自动处理文件名冲突**:当多个用户尝试上传同名文件时,该库会自动生成唯一的文件名,避免冲突。 - **元数据管理**:支持设置和获取OSS对象的元数据,如文件的MIME类型、访问权限等。 - **URL生成**:提供生成...
对于现代浏览器,还可以使用`FileReader` API预览或处理文件,例如读取文件内容、显示缩略图等。 4. 后端处理: 在后端,无论是Node.js、Java、Python还是其他语言,接收文件上传通常涉及解析多部分请求。例如,...
Django提供了处理文件上传的API,可以配置存储位置,如本地文件系统、云存储服务等。在settings.py中,可以设置`MEDIA_ROOT`和`MEDIA_URL`来管理用户上传的媒体文件。 10. 静态文件管理(Static Files): Django...