下面是关于Django如何实现文件上传下载的完整攻略及两条示例说明。
文件上传
1. 在模型中定义文件类型的字段
Django模型中有一个文件类型的字段(FileField),可以定义文件上传的位置以及文件存储在服务器上的名称。
示例:
from django.db import models
class NewFile(models.Model):
title = models.CharField(max_length=200)
file = models.FileField(upload_to='uploads/')
上面的代码定义了一个名为“NewFile”的模型,其中包括一个类型为“CharField”的title字段和一个类型为“FileField”的file字段。file字段的值为文件对象,文件将被上传到“uploads/”目录中。
2. 编写视图函数
视图函数处理文件上传的逻辑, 包括将文件保存到指定路径等。
示例:
from django.shortcuts import render
from django.core.files.storage import FileSystemStorage
def upload(request):
if request.method == 'POST' and request.FILES['myfile']:
myfile = request.FILES['myfile']
fs = FileSystemStorage()
filename = fs.save(myfile.name, myfile)
return render(request, 'upload.html', {'filename': filename})
return render(request, 'upload.html')
上面的代码定义了一个名为“upload”的视图函数,它内部的逻辑如下:
- 如果用户已经提交了一个POST请求,并且请求中包含了一个文件对象
- 则创建一个文件系统存储对象(fs)
- 通过FileSystemStorage()创建一个文件系统存储对象,系统会在django根目录/project/中创建一个uploads/文件夹,将文件名为myfile.name的文件保存到这个目录下
- 将成功上传的文件名返回给模板。
3. 编写模板
最后,编写HTML文件上传界面,包括提交表单和显示上传状态以及文件名等内容。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<h1>Upload file</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile">
<button type="submit">Upload</button>
</form>
{% if filename %}
<p>Your file {{ filename }} has been uploaded.</p>
{% endif %}
</body>
</html>
上面的代码为上传界面,包括文件上传的表单和上传状态的提示信息。其中,form表单的enctype属性为multipart/form-data表示可以上传文件类型。
文件下载
要使用Django提供的FileResponse实现文件下载,大致步骤如下:
1. URL配置
为文件下载服务创建URL。
示例:
from django.urls import path
from .views import file_download
urlpatterns = [
path('download/', file_download, name='file_download')
]
上面的代码定义了一个名为“download”的URL,指向名为“file_download”的视图函数。
2. 视图函数
定义相应的视图函数。
示例:
from django.http import FileResponse
import os
def file_download(request):
file_path = 'file_path'
if os.path.exists(file_path):
with open(file_path, 'rb') as fh:
response = HttpResponse(fh.read())
response['Content-Disposition'] = 'inline; filename=' + os.path.basename(file_path)
return response
raise Http404
上面的代码定义了一个名为“file_download”的视图函数,它的逻辑如下:
- 首先定义一个文件路径file_path,文件路径可以根据实际情况进行修改
- 然后判断文件路径是否存在
- 如果存在,则使用FileResponse返回文件
- 如果文件不存在,则抛出HTTP404错误。
3. 模板
最后,在 HTML 模板中,我们需要将文件的URL嵌入到一个链接标签中。
示例:
<a href="{% url 'file_download' %}">Download</a>
上面的代码创建一个指向文件下载URL的链接,点击链接就可以下载文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 如何实现文件上传下载 - Python技术站