django 实现文件上传并保存

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

函数默认会传入

  • instanceUploadFile 实例
  • 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>
  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值