django 上传文件夹_django

文件上传阅读:43797评论:6Django在处理文件上传时,文件数据会被打包封装在request.FILES中。文件上传一、简单上传,手动保存首先,写一个form模型,它必须包含一个FileField:from django import formsclass UploadFileForm(forms.Form):title = forms.CharField(max_length=50)fi...
摘要由CSDN通过智能技术生成

文件上传

阅读: 43797

评论:6

Django在处理文件上传时,文件数据会被打包封装在request.FILES中。

文件上传

一、简单上传,手动保存

首先,写一个form模型,它必须包含一个FileField:

from django import forms

class UploadFileForm(forms.Form):

title = forms.CharField(max_length=50)

file = forms.FileField()

处理这个表单的视图将在request.FILES中收到文件数据,可以用request.FILES['file']来获取上传文件的具体数据,其中的键值'file'是根据file = forms.FileField()的变量名来的。

注意:request.FILES只有在请求方法为POST,并且提交请求的

具有enctype="multipart/form-data"属性时才有效。 否则,request.FILES将为空。

下面是一个接收上传文件的视图范例:

# views.py

from django.http import HttpResponseRedirect

from django.shortcuts import render

from .forms import UploadFileForm

# 另外写一个处理上传过来的文件的方法,并在这里导入

from somewhere import handle_uploaded_file

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(request, 'upload.html', {'form': form}) # 思考一下这个return语句是否可以缩进到else语句中呢?

请注意,必须将request.FILES传递到form的构造函数中。

form = UploadFileForm(request.POST, request.FILES)

下面是一个处理上传文件的方法的参考例子:

def handle_uploaded_file(f):

with open('some/file/name.txt', 'wb+') as destination:

for chunk in f.chunks():

destination.write(chunk)

遍历UploadedFile.chunks(),而不是直接使用read()方法,能确保大文件不会占用系统过多的内存。

二、 使用模型处理上传的文件

如果是通过模型层的model来指定上传文件的保存方式的话,使用ModelForm更方便。 调用form.save()的时候,文件对象会保存在相应的FileField的upload_to参数指定的地方。

from django.http import HttpResponseRedirect

from django.shortcuts import render

from .forms import ModelFormWithFileField

def upload_file(request):

if request.method == 'POST':

form = ModelFormWithFileField(request.POST, request.FILES)

if form.is_valid():

# 这么做就可以了,文件会被保存到Model中upload_to参数指定的位置

form.save()

return HttpResponseRedirect('/success/url/')

else:

form = ModelFormWithFileField()

return render(request, 'upload.html', {'form': form})

如果手动构造一个对象,还可以简单地把文件对象直接从request.FILES赋值给模型:

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'])

instance.save()

return HttpResponseRedirect('/success/url/')

else:

form = UploadFileForm()

return render(request, 'upload.html', {'form': form})

三、 同时上传多个文件

如果要使用一个表单字段同时上传多个文件,需要设置字段HTML标签的multiple属性为True,如下所示:

# forms.py

from django import forms

class FileFieldForm(forms.Form):

file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

然后,自己编写一个FormView的子类,并覆盖它的post方法,来处理多个文件上传:

# views.py

from django.views.generic.edit import FormView

from .forms import FileFieldForm

class FileFieldView(FormView):

form_class = FileFieldForm

template_name = 'upload.html' # 用你的模版名替换.

success_url = '...' # 用你的URL或者reverse()替换.

def post(self, request, *args, **kwargs):

form_class = self.get_form_class()

form = self.get_form(form_class)

files = request.FILES.g

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django 中,上传文件需要进行以下步骤: 1. 定义一个文件上传表单 在 HTML 表单中添加 enctype="multipart/form-data" 属性,以便支持文件上传。 ```html <form method="post" enctype="multipart/form-data"> {% csrf_token %} <input type="file" name="myfolder" webkitdirectory directory multiple> <button type="submit">上传</button> </form> ``` 注意:需要将 input 标签的属性设置为 webkitdirectory directory multiple,以支持上传文件。 2. 在视图函数中处理文件上传 在视图函数中获取上传的文件,并将其保存到项目文件下。可以使用 Python 的 os 模块来处理文件的创建和文件的复制。 ```python import os def upload(request): if request.method == 'POST' and request.FILES['myfolder']: myfolder = request.FILES['myfolder'] folder_path = os.path.join('media', myfolder.name) os.makedirs(folder_path, exist_ok=True) for file in myfolder: file_path = os.path.join(folder_path, file.name) with open(file_path, 'wb+') as destination: for chunk in file.chunks(): destination.write(chunk) return render(request, 'upload.html') return render(request, 'upload.html') ``` 3. 显示上传后的文件上传文件成功后,可以将其显示给用户。可以在模板中使用上传文件的路径。 ```html {% if folder_path %} <p>上传成功!</p> <p>文件位置: {{ folder_path }}</p> {% endif %} ``` 注意:需要在 settings.py 文件中设置 MEDIA_ROOT 和 MEDIA_URL,以便访问上传的文件。 ```python MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值