Django实现文件上传下载功能
作者:罗汉爷 发布时间:2023-06-13 20:09:46
标签:Django,上传,下载
项目介绍
最近学习django,通过文件上传下载这个小项目,总结下常用的知识点。
做这个案例我有以下需求:
1.要支持一次上传多个文件
2.支持上传后记录上传的数据以及列表展示
3.支持下载和删除文件记录
效果展示
数据库记录
开发步骤
创建项目:
django-admin startproject file_upload
cd file_upload
python manage.py startapp uploader
目录结构:
0.settings.py
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
1.urls.py
父:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('uploader/', include('uploader.urls'))
]
子:
from django.contrib import admin
from django.urls import path, include
from . import views
app_name = 'uploader'
urlpatterns = [
path('', views.upload, name='upload'), # 上传
path('list/', views.list), # 列表
path('download/<id>', views.download, name='download'), # 下载
path('delete/<id>', views.delete, name='delete'), # 删除
]
2.models.py
from django.db import models
from django.utils import timezone
'''
文件记录
'''
class FileInfo(models.Model):
file_name = models.CharField(max_length=500)
file_size = models.DecimalField(max_digits=10, decimal_places=0)
file_path = models.CharField(max_length=500)
upload_time = models.DateTimeField(default=timezone.now())
3.forms.py
from django import forms
'''
上传表单
'''
class UploadForm(forms.Form):
file = forms.FileField(
widget=forms.ClearableFileInput(attrs={'multiple': True}), # 支持多文件上传
label='选择文件...',
help_text='最大100M'
)
4.views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.http import HttpResponseRedirect
from django.http import FileResponse
from django.template import RequestContext
from django.urls import reverse
from django.utils.http import urlquote
from .models import FileInfo
from .forms import UploadForm
import os
# 上传文件
def upload(request):
# Handle file upload
if request.method == 'POST':
form = UploadForm(request.POST, request.FILES)
if form.is_valid():
files = request.FILES.getlist('file')
for f in files:
file_info = FileInfo(file_name=f.name, file_size=1 if 0 < f.size < 1024 else f.size / 1024, file_path=os.path.join('D:\\upload', f.name))
file_info.save()
# 上传
destination = open(os.path.join("D:\\upload", f.name), 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
# 返回上传页
return HttpResponseRedirect('/uploader/list')
else:
form = UploadForm() # A empty, unbound form
return render(request, 'uploader/upload.html', {'form': form})
# 文件列表
def list(request):
file_infos = FileInfo.objects.all()
return render(request, 'uploader/list.html', {'file_infos': file_infos})
# 下载文件
def download(request, id):
file_info = FileInfo.objects.get(id=id)
print('下载的文件名:' + file_info.file_name)
file = open(file_info.file_path, 'rb')
response = FileResponse(file)
response['Content-Disposition'] = 'attachment;filename="%s"' % urlquote(file_info.file_name)
return response
# 删除文件
def delete(request, id):
file_info = FileInfo.objects.get(id=id)
file_info.delete()
file_infos = FileInfo.objects.all()
return HttpResponseRedirect('/uploader/list')
来源:https://blog.csdn.net/IndexMan/article/details/100592681


猜你喜欢
- 本文实例讲述了vue使用@scroll监听滚动事件时,@scroll无效问题的解决方法。分享给大家供大家参考,具体如下:在网上看了一下vue
- 本文实例讲述了Python实现计算文件MD5和SHA1的方法。分享给大家供大家参考,具体如下:不多说,直接源码:#file md5impor
- Dethe Elza (delza@livingcode.org), 高级技术架构师, Blast Radius &n
- 1.批量处理所谓的批处理就是批量处理cmd里面的命令。python要想实现批处理功能需要导入os库,然后利用批处理的命令为os.system
- 作为 Web 设计者,我们希望实现鹤立鸡群的设计,要做到这一点,要开阔眼界。欧美同东方的 Web 设计很不同,因为属于不同的文化。韩国不仅为
- SQL Server 2005默认是不允许远程连接的,要想通过远程连接实现MSSQL,数据库备份,需要做如下设置:步骤/方法1.打开SQL
- 为什么要使用缓存?一个 * 站的基本权衡点就是,它是动态的。 每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的
- 让 PHP 支持 MySQLPHP 有专有的 MySQL 函数库以使用操作 MYSQL 数据库。在 PHP 5 及以后版本中不再
- JavaScript封装弹框插件的具体代码,供大家参考,具体内容如下知识点1、document.querySelector() 方法quer
- 绑定的值与规则指定的值一定要相同-------第一步:<el-form :model="ruleForm" :ru
- 导读一篇用PyTorch Lighting提供模型服务的完全指南。纵观机器学习领域,一个主要趋势是专注于将软件工程原理应用于机器学习的项目。
- 字符串在内存中是不可变的,放在只读内存段,因此你可以使用str[0]来访问,但是不能使用str[0]='a'来修改。修改字符
- vuex状态刷新网页时数据被清空问题vuex状态管理,在网页刷新数据被清空的解决方法。在main.js中写入下面的代码段(亲测有效)//刷新
- MySQL binlog记录的所有操作实际上都有对应的事件类型的,譬如STATEMENT格式中的DML操作对应的是QUERY_EVENT类型
- 背景说的事务,大家应该都不陌生,开发用到 MySql 数据库的时候,通常会用到事务。其中比较经典的例子就是转账,比如你要给小明转 50 块钱
- DateTimeField日期+时间。与python里的 datetime.datetime 实例同。比如,数据库字段内容为2018-08-
- 开发过程中总避免不了遇到恶心的乱码,或者由乱码引发的一系列问题。出现乱码是字符集的原因一般而言和逻辑没有太大关系,也就是说整个系统大的方向没
- HTTP格式HTTP GET请求的格式:GET /path HTTP/1.1Header1: Value1Header2: Value2He
- 一、SQLAlchemy 介绍1.1 ORM 的概念ORM全称Object Relational Mapping(对象关系映射),通过 OR
- 两个文章,放在一块了。第二个比较强。====================================================