今天小编将为大家带来在django中如何通过网络进行文件的上传和下载,我们直接进入正文.
首先,前端通过表单将文件进行上传,上传到后端后,后端通过对上传文件进行读取写入到磁盘.
我们使用django的模板制作一个表单作为文件的上传,打开settings配置文件,配置templates.
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [os.path.join(BASE_DIR, "templates")],
"APP_DIRS": True,
"OPTIONS": {
"context_processors": [
"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",
],
},
},
]
配置完成后在项目目录下建一个templates目录和static目录(用来存放上传的文件),templates目录里面存放一个index.html文件里面是上传的表单.
index.html:
<html>
<head>
</head>
<body>
<form method="post" action="http://localhost:8000/twoshop/media/" enctype="multipart/form-data">
<label for="file">点击上传文件</label>
<input type="file" id="file" name="file">
<input type="submit">
</form>
</body>
</html>
其中表单必须带有enctype="multipart/form-data"属性可以发送文本数据和二进制数据.在我们先前注册的应用中写一个接口来访问表单,表单向另一个接口去发送数据.
首先在包含settings配置文件的与项目同名的目录中使用include将来自以"/"开头的请求发送给app.urls(这个地方写成你注册的app应用即可,我本机建的app应用所以写的app.urls)处理.
from django.urls import path,include
urlpatterns = [
path("/",include("app.urls")),
]
下面是app.urls(写成你注册应用的urls)的配置,写两个接口一个负责发送数据,一个负责下载数据:
from django.urls import path
from . import views
urlpatterns = [
#上传数据
path('senddata/', views.senddata, name='senddata'),
#得到上传的数据进行下载
path('adddata/', views.add_data, name='adddata')
]
在这个文件的同级目录下的view.py文件就可以写业务代码了:
def senddata(request):
return render(request,'index.html')
def add_data(request):
if request.method == 'POST':
file=request.FILES['file']
file_group=file.name.split('.')
with open('static/%s.%s' % (file_group[0],file_group[1]),'wb') as fq:
for chunk in file.chunks():
fq.write(chunk)
return HttpResponse('上传成功')
将上传的文件从request.FILES中进行下载到一个新的文件时,要防止写入文件时溢出内存区,所以使用file.chunks()来循环分块读取来写入文件.(写的很匆忙,如果有错请见谅.)