文件上传
文件上传是网站开发中非常常见的功能。这里详细讲述如何在Django中实现文件的上传功能。
form表单形式的文件上传
前端代码部分:
- 在前端中,我们需要填入一个form标签,然后在这个form标签中指定
enctype="multipart/form-data"
,不然就不能上传文件。 - 在form标签中添加一个input标签,然后指定input标签的name,以及
type="file
"
<form action="{% url 'cms:upload_file'%}" enctype="multipart/form-data" method="post">
{% csrf_token %}
<input type="file" name="file" >
<input type="submit" value="提交">
</form>
后端代码部分:
后端的主要工作是接收文件。然后存储文件。接收文件的方式跟接收POST的方式是一样的,只不过是通过FILES来实现。示例代码如下:
# 文件上传(form表单的形式)
def upload_file(request):
if request.method == 'GET':
return render(request,'cms/test.html')
else:
file = request.FILES.get('file')
print(file,type(file),file.name,file.size/1024)
with open(file.name,'wb') as fp:
for i in file.chunks():
fp.write(i)
return HttpResponse('ok')
ajax形式的文件上传
html代码部分:
{% csrf_token %}
<input type="file" name="file" id="btn">
js代码部分:
因为csrf的问题,所以引用了xfzajax
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script src="{% static 'js/xfzajax.min.js' %}"></script>
<script>
var btn = $('#btn');
btn.change(function () {
var file = btn[0].files[0];
var formData = new FormData();
formData.append('file',file);
xfzajax.post({
url:"/cms/upload_file/",
data:formData,
processData:false,
contentType:false,
success: function (result) {
if(result['code']===200){
window.location.reload();
}
}
})
});
</script>
后端部分代码:
后端代码和form表单的代码一致,只不过返回值需要和符合规范
def upload_file(request):
if request.method == 'GET':
return render(request,'cms/test.html')
else:
file = request.FILES.get('file')
print(file)
with open('1111','wb') as fp:
for i in file.chunks():
fp.write(i)
return restful.ok()
指定MEDIA_ROOT和MEDIA_URL
如果想要想上传的文件归纳到一起,就需要指定media_root和media_url
MEDIA_ROOT = os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/
然后我们可以在urls.py中添加MEDIA_ROOT目录下的访问路径。示例代码如下:
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('', views.index),
] + static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
最后在视图函数中修改一下文件路径,示例代码如下:
from django.conf import settings
import os
def upload_file(request):
if request.method == 'GET':
return render(request,'cms/test.html')
else:
file = request.FILES.get('file')
print(file)
with open(os.path.join(settings.MEDIA_ROOT,file.name),'wb') as fp:
for i in file.chunks():
fp.write(i)
return restful.ok()