Django 速成笔记(5) 文件上传 多个文件上传 之三种方法

Django 的文件上传可以说是相当的简单了,我们来看看

1.

第一种比较简单,但是可控度相对来说要高一些。

forms.py

#定义上传表单
class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

views.py

# 文件上传视图方法1
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 HttpResponse('文件上传成功!')
    else:
        form = UploadFileForm()
    return render(request, 'blog/upload.html', {'form':form})

#文件保存方法
def handle_uploaded_file(f):
    today = str(datetime.date.today())#获得今天日期
    file_name = today + '_' + f.name#获得上传来的文件名称,加入下划线分开日期和名称
    file_path = os.path.join(os.path.dirname(__file__),'upload_file',file_name)#拼装目录名称+文件名称
    with open(file_path, 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)        

templates





    
    loginfrom




 
{% csrf_token %} { { form }}

其中需要一个控制文件保存的方法,设置保存目录及保存的文件名。

2.

我们再看看第二种文件上传方法,相对来说更简单一些,但需要配置一下model。

models.py 先定义一个model,然后记得更新数据库生成表。

class FileModel(models.Model):
    title = models.CharField(max_length=50)
    file = models.FileField(upload_to='uploads/%Y%m%d/')

forms.py

form的代码没有什么变化。

#定义上传表单
class UploadFileForm(forms.Form):
    title = forms.CharField(max_length=50)
    file = forms.FileField()

views.py

视图代码中用了一个Django 自带的save()的方法代替了之前我自己定义的方法。

# 文件上传视图方法2
def upload_file(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():#表单数据如果合法
            upload_from = FileModel()
            upload_from.title = form.cleaned_data['title']
            upload_from.file = form.cleaned_data['file']
            upload_from.save()#处理上传来的文件
            return HttpResponse('文件上传成功!')
    else:
        form = UploadFileForm()
    return render(request, 'blog/upload.html', {'form':form})

模板中的代码没有变化。

3.

多个文件的上传方法

models.py

这上多文件上传的代码来自Django官方的示例

#这个方法可以定义上传文件的目录和名字。如果通过
def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_/
    return 'uploads/%Y%m%d-{0}'.format(filename)

class FileModel(models.Model):
    title = models.CharField(max_length=50)
    file = models.FileField(upload_to=user_directory_path)

forms.py

# 多个文件上传
class FileFieldForm(forms.Form):
    file_field = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

views.py

视图中的代码有一个循环迭代for,这里分别去用handle_uploaded_file()方法保存上传来的多个文件 handle_uploaded_file(f)方法参见上边。

# 多个文件上传视图
def upload_file(request):
    if request.method == 'POST':
        form = FileFieldForm(request.POST, request.FILES)
        files = request.FILES.getlist('file_field')#获得多个文件上传进来的文件列表。
        if form.is_valid():#表单数据如果合法
            for f in files:
                handle_uploaded_file(f)#处理上传来的文件
            return HttpResponse('文件上传成功!')
    else:
        form = FileFieldForm()
    return render(request, 'blog/upload.html', {'form':form})

模板代码忽略。。。

多文件上传也可以自己组织html上传的表单代码,只要记得上传来的多个文件是一个list然后for循环迭代处理一下即可。而且我们可以试试,用save()来处理多个文件的上传保存。。。

转载于:https://my.oschina.net/jsky/blog/1483819

你可能感兴趣的:(python,数据库)