当前位置:   article > 正文

Django 文件上传(十二)_django上传多个文件

django上传多个文件

当 Django 处理文件上传时,文件数据最终会被放置在 request.FILES 。

查看文档:文件上传 | Django 文档 | Django

Django工程如下: 

 

创建本地存储目录

在static/应用目录下创建uploads目录用于存储接收上传的文件

 在settings.py 配置静态目录和上传目录

  1. #指定静态文件路径
  2. STATICFILES_DIRS=[
  3. BASE_DIR / 'static'
  4. ]
  5. #媒体文件本地存放路径 (如果是模块,则必须指定哦!!)
  6. MEDIA_ROOT= BASE_DIR / 'App/static/uploads'

一、单个文件上传 

  1、models.py模型数据

  1. from django.db import models
  2. # Create your models here.
  3. #存放用户图片数据表
  4. class UserModel(models.Model):
  5. #用户名
  6. name=models.CharField(max_length=100,unique=True)
  7. #图片
  8. icon=models.CharField(max_length=300)
  9. class Meta:
  10. db_table='user'
  11. verbose_name='用户表'
  12. verbose_name_plural=verbose_name

注意:迁移文件 

  2、upload.html页面

  1. <body>
  2. <h2>单个文件上传</h2>
  3. <hr/>
  4. <form action="" method="post" enctype="multipart/form-data">
  5. {% csrf_token %}
  6. <p>用户名:<input type="text" name="uname"/></p>
  7. <p>头像:<input type="file" name="icon"/></p>
  8. <p><button>上传图片</button></p>
  9. </form>
  10. </body>

注意:from表单上传文件需要加 enctype=”multipare/form-data”  必须是post请求。

3、views.py视图函数

  1. #单个文件上传
  2. def upload_1(request):
  3. if request.method=='GET':
  4. return render(request,'upload.html')
  5. elif request.method=='POST':
  6. #获取文件上传数据
  7. uname=request.POST.get('uname')
  8. #获取文件
  9. icon=request.FILES.get('icon')
  10. #上传到本地
  11. #调用方法-
  12. #337791d7-8ae5-4d97-b0d8-17dcc71fd94f.jpg
  13. filename=getUuidName()+icon.name[icon.name.rfind('.'):]
  14. #1.分段保存上传的路径
  15. file_path=os.path.join(settings.MEDIA_ROOT,filename)
  16. print(filename,file_path)
  17. #分段存入
  18. with open(file_path,'ab') as f:
  19. #循环
  20. for part in icon.chunks():
  21. f.write(part) #写入
  22. f.flush() #清空缓存
  23. #2.将上传文件保存到数据表中
  24. user=UserModel()
  25. user.name=uname
  26. user.icon='uploads/'+filename
  27. user.save()
  28. return render(request, 'upload.html')
  29. #通过uuid获取唯一的图片名
  30. def getUuidName():
  31. return str(uuid.uuid4()) #随机生成名字
  32. #显示图片
  33. def showImg(request,id):
  34. user= UserModel.objects.get(pk=id)
  35. return render(request, 'show.html',{'user':user})
'
运行

4、urls.py路由

  1. from django.contrib import admin
  2. from django.urls import path
  3. from App.views import *
  4. urlpatterns = [
  5. path('index/', index), # 静态文件
  6. path('up1/', upload_1), # 文件上传
  7. path('show/<int:id>', showImg, name='show'), # 显示图片
  8. path('up2/', upload_2), # 文件上传more
  9. path('show2/<int:id>', showImg2, name='show2'), # 显示图片more
  10. path('admin/', admin.site.urls),
  11. ]

5、show.html 显示上传的图片

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. {% load static %}
  7. <link rel="stylesheet" href="{% static 'css/show.css' %}">
  8. </head>
  9. <body>
  10. <h2>显示图片</h2>
  11. <hr/>
  12. {% load static %}
  13. <p id="p">{{ user.name }}</p>
  14. <p><img src="{% static user.icon %}"> </p>
  15. </body>
  16. </html>

6、运行

 

二、多个文件上传 

   1、uploadmore.html页面

  1. <body>
  2. <h2>多个文件上传</h2>
  3. <hr/>
  4. <form action="" method="post" enctype="multipart/form-data">
  5. {% csrf_token %}
  6. <p>用户名:<input type="text" name="uname"/></p>
  7. {# <p>头像:<input type="file" name="icon"/></p>#}
  8. {{ form }}
  9. <p><button>上传图片</button></p>
  10. </form>
  11. </body>

  2、views.py视图函数

  1. #########################################################
  2. #表单类
  3. class FileUploadForm(forms.Form):
  4. files=forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple':True}))
  5. #多个文件上传
  6. def upload_2(request):
  7. if request.method == 'POST':
  8. #获取表单类
  9. form=FileUploadForm(request.POST,request.FILES)
  10. #判断
  11. if form.is_valid():
  12. # 获取文件上传数据
  13. uname = request.POST.get('uname')
  14. # 获取文件
  15. icons = request.FILES.getlist('files')
  16. #保存多个文件名
  17. ll_names=[]
  18. #循环图片
  19. for file in icons:
  20. #处理上传文件
  21. handle_uploaded_file(file)
  22. #保存文件名
  23. ll_names.append('uploads/' + file.name)
  24. #列表转换成字符串
  25. strs = ','.join(ll_names)
  26. # 2.将上传文件保存到数据表中
  27. user = UserModel()
  28. user.name = uname
  29. user.icon =strs
  30. user.save()
  31. # print(ll_names, strs)
  32. return render(request, 'showmore.html')
  33. else:
  34. form = FileUploadForm()
  35. return render(request, 'uploadmore.html', {'form': form})
  36. def handle_uploaded_file(file):
  37. """ 文件保存处理 """
  38. filePath = os.path.join(settings.MEDIA_ROOT, file.name)
  39. # 保存文件
  40. with open(filePath, 'wb+') as fp:
  41. for info in file.chunks():
  42. fp.write(info)
  43. fp.flush()
  44. #显示图片
  45. def showImg2(request,id):
  46. user= UserModel.objects.get(pk=id)
  47. return render(request, 'showmore.html',{'user':user})

3、自定义模板标签和过滤器

     文档:https://docs.djangoproject.com/zh-hans/4.0/howto/custom-template-tags/

  1. from django.template import Library
  2. register = Library()
  3. @register.filter(name="split")
  4. def split(value, key):
  5. """
  6. Returns the value turned into a list.
  7. """
  8. return value.split(key)

注意:必须重启服务器,自定义模板才生效!!

  4、showmore.html 显示上传的图片

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. {% load static %}
  7. <link rel="stylesheet" href="{% static 'css/show.css' %}">
  8. </head>
  9. <body>
  10. <h2>显示更多图片</h2>
  11. <hr/>
  12. {% load static %}
  13. <p id="p">{{ user.name }}</p>
  14. {# 开发服务器并不会自动重启 添加 templatetags 模块后,你需要重启服务器,这样才能在模板中使用 tags 和 filters。#}
  15. {# 加载自定义模板#}
  16. {% load myfilter %}
  17. {% with user.icon|split:"," as details %}
  18. {% for im in details %}
  19. <p><img src="{% static im %}"> </p>
  20. {% endfor %}
  21. {% endwith %}
  22. </body>
  23. </html>

  5、运行

 

 

单个或多个文件上传,查看文档还是容易实现!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/938245
推荐阅读
相关标签
  

闽ICP备14008679号