html超链接直接下载不再网页中打开,在a标签里添加 download="",""里面的内容可随意写,比如文件名
<a href="/download/下载.pdf" download="">下载.pdf</a>
models.py
from django.db import models
class UploadFile(models.Model):
title = models.CharField(verbose_name="图片标题", max_length=50)
path = models.FileField(upload_to='files/')
views.py
from django.shortcuts import render, HttpResponse
from .models import UploadFile
def upload_file(request):
if request.method == "POST":
up_file = request.FILES.get('upload_file')
UploadFile(title=up_file.name, path=up_file).save()
return HttpResponse('success')
else:
return render(request, "blog/upload_file.html")
upload_file.html
enctype="multipart/form-data"
name="upload_file"
与request.FILES.get('upload_file')
名字对应
<form action="{% url "upload_file" %}" role="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group text-center">
<label for="inputfile" class="col-md-2">上传文件</label>
<div class="col-md-10">
<input name="upload_file" type="file" id="inputfile">
</div>
</div>
<div style="clear: both"></div>
<p style="margin-top: 100px"><button type="submit" class="col-sm-offset-2 btn btn-primary">提交文件 </button></p>
</form>
settings.py
- 指定上传文件保存路径的根目录
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('uploadfile/', views.upload_file, name="upload_file"),
]
实现保存的文件与 request
内容相关
def upload_file(request):
if request.method == "POST":
up_file = request.FILES.get('upload_file')
UploadFile(title=up_file.name, path=up_file).save(request=request)
return HttpResponse('success')
else:
return render(request, "blog/upload_file.html")
根据函数返回值,保存文件
方式1
函数默认会传入
instance
为UploadFile
实例filename
为文件名
from django.db import models
def upload_path(instance, filename):
print(instance.rq)
print(filename)
return "files/"
class UploadFile(models.Model):
title = models.CharField(verbose_name="图片标题", max_length=50)
path = models.FileField(upload_to=upload_path)
rq = None
def save(self, *args, **kwargs):
UploadFile.rq = kwargs.pop("request")
print(UploadFile.rq)
super().save(*args, **kwargs)
方式2
- 对模型添加设置与获取
request
的方法
from django.shortcuts import render, HttpResponse
from .models import UploadFile
def upload_file(request):
if request.method == "POST":
up_file = request.FILES.get('upload_file')
f = UploadFile(title=up_file.name, path=up_file)
f.set_request(request)
f.save()
return HttpResponse('success')
else:
return render(request, "blog/upload_file.html")
from django.db import models
def upload_path(instance, filename):
print(instance.get_request().method)
print(filename)
return "files/"
class UploadFile(models.Model):
title = models.CharField(verbose_name="图片标题", max_length=50)
path = models.FileField(upload_to=upload_path)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
def set_request(self, request):
self.request = request
def get_request(self):
return self.request
文件下载
方式1
- 利用 django 静态文件特性,保存上传文件到静态文件目录下,利用静态文件下载功能实现, MEDIA_ROOT 指定上传文件的路径,不指定则存放在项目路径下。
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
]
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload')
下载界面
{% for file_obj in file_list %}
<div class="row">
<a href="/upload/{{ file_obj.path }}">{{ file_obj.title }}</a>
</div>
{% endfor %}
方式2
- 保存到 media 目录,需要配置路由,
path
会自动传入serve
作为参数
from django.conf.urls import url
from django.urls import path
from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)', serve, {"document_root": settings.MEDIA_ROOT}),
]
方式3
- 保存到 media 目录
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
完整配置
settings.py
STATIC_URL = '/static/' # 指定静态文件访问时候url
MEDIA_ROOT = os.path.join(BASE_DIR, 'upload') # 上传文件保存根目录
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'upload') # 把上传的文件当作静态文件加入到目录中,方便访问
]
urls.py
from django.urls import path
from . import views
urlpatterns = [
# 处理文件上传
path('uploadfile/', views.upload_file, name="upload_file"),
]
views.py
def upload_file(request):
if request.method == "POST":
up_file = request.FILES.get('upload_file')
UploadFile(title=up_file.name, path=up_file).save(request=request)
return HttpResponse('success')
else:
return render(request, "blog/upload_file.html")
models.py
class UploadFile(models.Model):
title = models.CharField(verbose_name="图片标题", max_length=50)
path = models.FileField(upload_to='attach_file/') # 文件保存在os.path.join(BASE_DIR, 'upload') 目录下
upload_file.html
<form action="{% url "upload_file" %}" role="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group text-center">
<label for="inputfile" class="col-md-2">上传文件</label>
<div class="col-md-10">
<input name="upload_file" type="file" id="inputfile">
</div>
</div>
<div style="clear: both"></div>
<p style="margin-top: 100px"><button type="submit" class="col-sm-offset-2 btn btn-primary">提交文件 </button></p>
</form>
下载,直接在静态文件目录下查找对应文件,需要加入 STATICFILES_DIRS
<a style="color: #fff;" href="/static/{{ attach.file }}" download="{{ attach.title }}">下载</a>