6. 上传图片

前端页面上传完恩济或者图片类内容的时候,需要用到一个上传控件,此时, 文件数据被保存在request.FILES, django后台可以直接读取FILES中的内容。

FILES中的每个键为<input type="file" name="" />中的name值。

  • 注意:FILES只有在请求的方法为POST 且提交的
    带有enctype=”multipart/form-data” 的情况下才会包含数据。
  • 否则,FILES 将为一个空的类似于字典的对象

6.1. 使用模型处理上传文件:

  • Model中有属性为models.ImageField类型, 可以用来存放图片。

    # upload_to代表此文件存储位置
    pic=models.ImageField(upload_to='cars/')
    

    注意:如果属性类型为ImageField需要安装包Pilow

    pip3 install Pillow==3.4.1
    
  • 图片存储路径

    默认图片存储在项目根目录下创建media文件夹。

    代码收到上传图片后会自动上传:

    
    pic=models.ImageField(upload_to='cars/')
    

    图片上传后,会被保存到“/static/media/cars/图片文件”

  • 配置settings.py

    1. 打开settings.py文件,增加media_root项
    2. MEDIA_ROOT=os.path.join(BASE_DIR,"static/media")
    3. 使用django后台管理,遇到ImageField类型的属性会出现一个file框,完成文件上传

6.2. 手动上传的模板代码

模板也可以手动处理上传,此时需要从FILES读取内容。

  • 前端页面示例

      <html>
      <head>
          <title>文件上传</title>
      </head>
      <body>
          <form method="post" action="upload/" enctype="multipart/form-data">
              <input type="text" name="title"><br>
              <input type="file" name="pic"/><br>
              <input type="submit" value="上传">
          </form>
      </body>
      </html>
    
  • 手动上传的视图代码

      import time,os
      def upload(request):
          #执行图片的上传
          myfile = request.FILES.get("mypic",None)
          if not myfile:
              return HttpResponse("没有上传文件信息")
          filename = str(time.time())+"."+myfile.name.split('.').pop()
          destination = open("./static/pics/"+filename,"wb+")
          for chunk in myfile.chunks():      # 分块写入文件  
              destination.write(chunk)  
          destination.close()
          return filename