django + python两种方式实现上传文件

994 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

 ### 前言

今天突然心血来潮,研究了下django+python是如何上传文件的,并且总结出了两种方式能够实现文件的上传,接下来让我们一起看一下具体如何实现。

第一:直接采用文件读写的方式上传

第一种方式是利用文件流的读写实现上传,总体来说实现起来也不算难,大概分为三步

  • 第一步是修改配置文件settings.py添加路径代码用于存放文件上传后的位置
  • 第二步配置html模板,添加input元素用于选择要上传的文件,需要注意的是form表单需要添加enctype=multipart/form-data。来标识上传是文件
  • 第三步就是编写python代码了从而通过流的读取的方式实现文件上传 下面我们来看下具体实现的代码
  1. settings.py文件中设置文件的存放路径和文件读取路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
  1. html模板文件:
<form method="post" enctype="multipart/form-data">
    <input type="file" name='photo'>
</form>
  1. python后台代码
import os
from django.conf import settings

file = request.FILES.get('photo')

saved_path = os.path.join(settings.MEDIA_ROOT, 'user_photos')
if not os.path.exists(saved_path): #如果文件路径不存在则创建文件保存目录
    os.mkdir(saved_path)

saved_file = os.path.join(saved_path, file.name)#file.name为带后缀的文件名

with open(saved_file, 'wb+') as of: #以二进制留写的方式写入文件,文件不存在则自动创建
    if file.multiple_chunks():#判断如果文件大于默认值2.5M(可以修改)则采用分块的方式上传
        for fc in file.chunks():
            of.write(fc)
    else:
        of.write(file.read())#小于2.5M则直接上传

第二:利用django自带的文件存储系统上传

第二种方式相交第一种方式要简单很多,因为我们用的是django自带的库实现上传,代码上更为简洁,前两步settings配置和HTML模板配置跟第一步是一样的。第三步的时候我们用来django自带的库去实现上传。具体代码实现如下所示

  1. settings.py文件设置同上

  2. html模板同上

  3. 模型类定义

from django.db import models

class UserInfo(models.Model):
    photo = models.ImageFile(upload_to="user_photo")#如果目录不存在django会自动创建
  1. python后台代码
file = request.FILES.get('photo')

u = UserInfo()
u.photo = file

u.save()

以上变实现了简单的两种文件上传的方式。