今天尝试了文件上传,基于from表单下的, 多了两个设置, 1.MEDIA_URL 2.MEDIA_ROOT 这两个设置需要在setting中写好路径, 然后在models中新建一个类用来储存上传信息 class Files(models.Model): files=Filesfiled(upload_to=’media’) 默认如果在media_root中设置了路径就不需要填写了,没有设置就需要填写upload_to这项。 还有就是在前端文件提交表单中必须要有 enctype=”multipart/form-data” 这一项,这样后台才能明白你是要上传一个文件,而不是获取文件名,可以通过file.name 或者file.size 获取文件的大小,还可以获取文件的后缀用来限制上传文件的类型。 然后在视图中只需要把model中的类导入 然后Files.objects.create(file=file)这样前台提交的文件就模型就直接帮我们记录好,然后提交到了数据库记录,放到了media文件夹下,非常的方便,省掉了很多的麻烦。不用自己再去写一个文件上传的逻辑,像这样 *** print(file,type(file)) if not file: return HttpResponse(‘没有文件呀,老铁’) # 保存文件 with open(os.path.join(f’./{file}’),’wb’)as f: # 用chunk 分块写入就不会报错了, for chunk in file.chunks(): f.write(chunk) *** 自己写的话保存文件的时候一定要写chunks这一步,不然会报出notype的错误,大致的意思就是不能保存字符串之类的提示,很烦人。而直接用模型的话就不会有这个提示,而且逻辑更加的清晰,后续的判断也更加方便
view视图
代码语言:javascript复制def index(request):
f=models.Files.objects.all()
if request.method=='POST':
file=request.FILES.get('file',None)
# print(file,type(file))
if not file:
return HttpResponse('没有文件呀,老铁')
# # 保存文件
# with open(os.path.join(f'./{file}'),'wb')as f:
# # 用chunk 分块写入就不会报错了,
# for chunk in file.chunks():
# f.write(chunk)
models.Files.objects.create(file=file,title=file,size=file.size)
return HttpResponse('完成')
return render(request,'base.html',context={'data':f})
models
代码语言:javascript复制class Files(models.Model):
title=models.CharField(max_length=100,verbose_name='文件名')
size=models.CharField(max_length=100,verbose_name='文件大小',null=True)
file=models.FileField(verbose_name='地址')
times=models.DateTimeField(auto_now_add=True,verbose_name='上传时间')
html
代码语言:javascript复制<form id="form" action="" method="post" runat="server" enctype="multipart/form-data">
# 一定要加上这句
urls
代码语言:javascript复制from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('project.urls')),
] static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)