Django文件上传

酥酥 发布于 2021-09-18 925 次阅读


Django文件上传

  • 定义:用户可以通过浏览器将图片等文件传至网站

  • 场景:用户上传头像,上传流程性的文档[pdf, txt等]

前端HTML处

文件上传必须为POST提交方式
表单<form>中文件上传时必须有带有
enctype= "multipart/form-data"时才会包含文件内容数据。
表单中用<input type="file" name="xx">标签上传文件

enctype= “multipart/form-data” 还是可以支持input type=”text”的

后端Django处

视图函数中,用 request.FILES取文件框的内容 (PS:如果有POST TEXT等数据一起进来的话还是要POST来取)

file=request. FILES[‘XXX’]

说明:

  1. FILES的key对应页面中fle框的name值

  2. file绑定文件流对象

  3. file.name文件名

  4. file.file文件的字节流数据

配置文件的访问路径和存储路径

在setting.py中设置MEDIA相关配置; Django把用户上传的文件,统称为media资源

Django把用户上传的文件,统称为media资源

#file : settings.py

  • MEDIA_URL = ‘/media/

  • MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)

创建media文件夹


MEDIA_URL和 MEDIA_ROOT需要手动绑定

步骤:主路由中添加路由

from django.conf import settings

from django.conf.urls.static import static

urlpatterns + static(settings. MEDIA_URL, document_root=settings. MEDIA_ROOT)

说明:等价于做了 MEDIA URL开头的路由, Django接到该特征请求后去 MEDIA ROOT路径查找资源

接收文件

文件写入方案1:
传统的open方式
@csrf_exempt
def upload_view(request):
     if request.method = 'GET':
         return render (request, 'test_upload.html')
     elif request.method == "POST":
         a_file = request.FILES ['myfile']
         print("上传文件名是:", a_file.name)
         filename =os.path.join(settings.MEDIA_ROOT, a_file.name)
     with open(filename, 'wb') as f:
         data =a_file.file.read()
         f.write (data)
         return HttpResponse ("接收文件:" + a_file.name + "成功")

文件写入方案2:
借助ORM;
字段:FileField(upload_to='子目录名")
@csrf_exempt
def up1oad_view_dj(request):
   if request.method=='GET':
       return render(request,'test_up1oad.html')
   elif request.method=='POST':
       title = request.POST['title']
       a_file =request.FILES['myfile']                            
Content.objects.create(desc=tit1e,my file=a_file) 
return HttpResponse(' '----upload is ok----')