django-文件上传

2020-05-09 15:45:13 浏览数 (2)

今天尝试了文件上传,基于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)

0 人点赞