小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
### 前言
今天突然心血来潮,研究了下django+python是如何上传文件的,并且总结出了两种方式能够实现文件的上传,接下来让我们一起看一下具体如何实现。
第一:直接采用文件读写的方式上传
第一种方式是利用文件流的读写实现上传,总体来说实现起来也不算难,大概分为三步
- 第一步是修改配置文件settings.py添加路径代码用于存放文件上传后的位置
- 第二步配置html模板,添加input元素用于选择要上传的文件,需要注意的是form表单需要添加enctype=multipart/form-data。来标识上传是文件
- 第三步就是编写python代码了从而通过流的读取的方式实现文件上传 下面我们来看下具体实现的代码
- settings.py文件中设置文件的存放路径和文件读取路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
- html模板文件:
<form method="post" enctype="multipart/form-data">
<input type="file" name='photo'>
</form>
- 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自带的库去实现上传。具体代码实现如下所示
-
settings.py文件设置同上
-
html模板同上
-
模型类定义
from django.db import models
class UserInfo(models.Model):
photo = models.ImageFile(upload_to="user_photo")#如果目录不存在django会自动创建
- python后台代码
file = request.FILES.get('photo')
u = UserInfo()
u.photo = file
u.save()
以上变实现了简单的两种文件上传的方式。