目录
在开发过程中我们经常要遇到需要像服务器上传文件的操作,那么Django是怎么实现文件上传的功能呢,下面我们先来实现个最简单的文件上传功能,详细的讲解下Django整个文件上传实现的过程。
建立模型
在model.py中设计文件模型机构,这里为了简单我就定义了一个file字段,类型为FileField,通过参数upload_to指定上传文件的保存目录,这里我们直接用'./upload'定义了此目录所以不需要提前建立,在迁移数据库时会自动在项目目录下创建对应的文件夹。
class File(models.Model):
file = models.FileField(upload_to='./upload')
def __str__(self):
return self.file
class Meta:
db_table = 'file' #数据库后显示的model名称
当然你也可以通过在settings.py里设置MEDIA_ROOT,来代替upload_to参数,MEDIA_ROOT:#指定文件上传存储目录,这样使用FileField字段时,就不用设置upload_to参数了,在settings.py设置:
# 设置浏览器访问路径
MEDIA_URL = '/upload/'
# 指定文件上传存储目录
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
执行迁移命令,同步至数据库:
Python manage.py makemigrations
python manage.py migrate
定义视图
迁移完数据库我们开始定义视图,这里我们通过request.FILES.get()方法来获取我们的文件对象,这里需要像服务器提交数据,所以我们用POST方法来实现,然后将文件路径存入数据库中。
def uploadfile(request):
if request.method == "POST":
fileName = request.FILES.get('filename') # 获取前台传来的文件对象
models.File.objects.update_or_create(file=fileName)
配置路由
为视图配置访问路由,我定义了一个upload,我们只要访问http://127.0.0.1:8000/upload/就可以找到对应的路由了,因为这是POST请求接口,需要携带数据进行接口访问,不然就会报错。
from django.conf.urls import url
from user import views
urlpatterns = [
url(r'^login/$',views.login),
url(r'^register/$',views.register),
url(r'^upload/$',views.uploadfile)
]
postman接口测试
通过postman模拟POST请求来测试该接口,我们提交一个文件类型的参数进行POST访问,这里我传了一个文件名为1.png的图片文件,传输形式为form-data。
查看服务器及数据库变化
首先我们来看下数据库中是怎么存储的,我们可以看到再说数据库中,文件是以相对路径+文件名的形式存储的,而在项目目录中我们可以看到有个upload目录,里面存储了一个名为1.png的文件,这就是我们刚才上传的文件。
文件如何上传
这个过程中Django自动为我们实现了文件存储的操作,想深层的了解如何上传的话可以了解下如何读写文件,直接用python的open方法进行文件读写操作就可以实现。
fileName = request.FILES.get('filename')
read=open(os.path.join('./upload',fileName.name),'wb+')# 二进制打开文件进行写操作
for chunk in fileName.chunks():
read.write(chunk) # 写入文件
read.close()