下面我来详细讲解“django上传文件的三种方式”的完整攻略,并提供两个示例说明:
一、使用普通的表单方式上传文件
普通的表单方式上传文件,适用于上传文件较小的情况。
1. 表单页面
首先,需要在前端编写表单页面,其中要包括type为file的input标签,以便用户选择上传文件。
<form action="{% url 'upload_file' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file">
<button type="submit">上传</button>
</form>
其中,"{% url 'upload_file' %}"是表单的提交地址,需要在后端进行url映射。
2. 后台处理
在后台views.py中定义上传文件的处理函数。
def upload_file(request):
if request.method == 'POST':
# 获取上传的文件
file = request.FILES.get('file')
# 进行文件处理
...
return HttpResponse('上传成功')
注意要在函数头部添加@csrf_exempt
装饰器,以免 csrf 异常。此外,可根据实际需要进行文件处理。
二、使用ajax方式上传文件
ajax方式上传文件,具有不刷新页面即可上传的优点,适用于上传文件较大的情况。
1. 表单页面
在前端编写带有ajax上传功能的表单页面。
<form id="upload-form" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="file">
<button type="button" onclick="uploadFile()">上传</button>
</form>
<script>
function uploadFile() {
let form = document.querySelector('#upload-form');
let formData = new FormData(form);
let xhr = new XMLHttpRequest();
xhr.open('POST', "{% url 'upload_file' %}");
xhr.setRequestHeader("X-CSRFToken", "{{csrf_token}}");
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log('上传成功');
}
}
xhr.send(formData);
}
</script>
其中,与普通表单最大的不同是,此处需要使用javascript编写上传文件的函数,并利用XMLHttpRequest对象发送请求。
2. 后台处理
与普通表单方式一致,也需要在后台views.py文件中定义上传文件的处理函数。
@csrf_exempt
def upload_file(request):
if request.method == 'POST':
# 获取上传的文件
file = request.FILES.get('file')
# 进行文件处理
...
return HttpResponse('上传成功')
三、使用第三方包上传文件
如果不希望手动编写上传文件的处理函数,也可以使用现成的第三方包进行文件上传操作。常见的第三方包有django-storages、django-filetransfers等。
以django-storages为例,需要进行以下几步操作:
1. 安装依赖
pip install django-storages
2. 配置settings.py
# settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = 'mybucket'
这里以AWS S3为例,Need配置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。
3. 修改上传文件的处理函数
使用django-storages以后,只需要进行以下简单的修改即可完成文件上传。
@csrf_exempt
def upload_file(request):
if request.method == 'POST':
# 获取上传的文件
file = request.FILES.get('file')
# 进行文件处理
...
# 上传至S3
s3 = boto3.client('s3', region_name='us-east-1')
s3.upload_file(file.temporary_file_path(), AWS_STORAGE_BUCKET_NAME, file.name)
return HttpResponse('上传成功')
总结:
以上三种方式都非常常见,但具有各自的优缺点。在选择上传文件的方式时,需要根据实际情况进行选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django上传文件的三种方式 - Python技术站