前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vue+django实现下载文件

vue+django实现下载文件

作者头像
py3study
发布于 2021-03-04 07:19:40
发布于 2021-03-04 07:19:40
2.1K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、概述

在项目中,点击下载按钮,就可以下载文件。

传统的下载链接一般是get方式,这种链接是公开的,可以任意下载。

在实际项目,某些下载链接,是私密的。必须使用post方式,传递正确的参数,才能下载。

二、django项目

本环境使用django 3.1.5,新建项目download_demo

安装模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip3 install djangorestframework django-cors-headers

 修改文件download_demo/settings.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'api.apps.ApiConfig',
    'corsheaders',  # 注册应用cors
]

注册中间件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware',  # 注册组件cors
]

最后一行增加

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True

CORS_ALLOW_METHODS = (
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

修改download_demo/urls.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.urls import path
from api import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('download/excel/', views.ExcelFileDownload.as_view()),
]

修改api/views.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.shortcuts import render,HttpResponse
from download_demo import settings
from django.utils.encoding import escape_uri_path
from django.http import StreamingHttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework import status
import os

class ExcelFileDownload(APIView):
    def post(self,request):
        print(request.data)
        # filename = "大江大河.xlsx"
        filename = request.data.get("filename")
        download_file_path = os.path.join(settings.BASE_DIR, "upload",filename)
        print("download_file_path",download_file_path)

        response = self.big_file_download(download_file_path, filename)
        if response:
            return response

        return JsonResponse({'status': 'HttpResponse', 'msg': 'Excel下载失败'})

    def file_iterator(self,file_path, chunk_size=512):
        """
        文件生成器,防止文件过大,导致内存溢出
        :param file_path: 文件绝对路径
        :param chunk_size: 块大小
        :return: 生成器
        """
        with open(file_path, mode='rb') as f:
            while True:
                c = f.read(chunk_size)
                if c:
                    yield c
                else:
                    break

    def big_file_download(self,download_file_path, filename):
        try:
            response = StreamingHttpResponse(self.file_iterator(download_file_path))
            # 增加headers
            response['Content-Type'] = 'application/octet-stream'
            response['Access-Control-Expose-Headers'] = "Content-Disposition, Content-Type"
            response['Content-Disposition'] = "attachment; filename={}".format(escape_uri_path(filename))
            return response
        except Exception:
            return JsonResponse({'status': status.HTTP_400_BAD_REQUEST, 'msg': 'Excel下载失败'},
                                status=status.HTTP_400_BAD_REQUEST)

在项目根目录创建upload文件

 里面放一个excel文件,比如:大江大河.xlsx

三、vue项目

新建一个vue项目,安装ElementUI 模块即可。

新建test.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div style="width: 70%;margin-left: 30px;margin-top: 30px;">
    <el-button class="filter-item" type="success" icon="el-icon-download" @click="downFile()">下载</el-button>
  </div>
</template>

<script>
  import axios from 'axios'

  export default {
    data() {
      return {
      }
    },
    mounted: function() {

    },
    methods: {
      downloadFile(url, options = {}){
        return new Promise((resolve, reject) => {
          // console.log(`${url} 请求数据,参数=>`, JSON.stringify(options))
          // axios.defaults.headers['content-type'] = 'application/json;charset=UTF-8'
          axios({
            method: 'post',
            url: url, // 请求地址
            data: options, // 参数
            responseType: 'blob' // 表明返回服务器返回的数据类型
          }).then(
            response => {
              // console.log("下载响应",response)
              resolve(response.data)
              let blob = new Blob([response.data], {
                type: 'application/vnd.ms-excel'
              })
              // console.log(blob)
              // let fileName = Date.parse(new Date()) + '.xlsx'
              // 切割出文件名
              let fileNameEncode = response.headers['content-disposition'].split("filename=")[1];
              // 解码
              let fileName = decodeURIComponent(fileNameEncode)
              // console.log("fileName",fileName)
              if (window.navigator.msSaveOrOpenBlob) {
                // console.log(2)
                navigator.msSaveBlob(blob, fileName)
              } else {
                // console.log(3)
                var link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
                //释放内存
                window.URL.revokeObjectURL(link.href)
              }
            },
            err => {
              reject(err)
            }
          )
        })
      },
      // 下载文件
      downFile(){
        let postUrl= "http://127.0.0.1:8000/download/excel/"
        let params = {
          filename: "大江大河.xlsx",
        }
        // console.log("下载参数",params)
        this.downloadFile(postUrl,params)
      },
    }
  }
</script>

<style>
</style>

注意:这里使用post请求,并将filename传输给api,用来下载指定的文件。 

访问测试页面,点击下载按钮

 就会自动下载

打开工具栏,查看响应信息

这里,就是django返回的文件名,浏览器下载保存的文件名,也是这个。

遇到中文,会进行URLcode编码。

所以在vue代码中,对Content-Disposition做了切割,得到了文件名。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
hadoop大数据平台架构之DKhadoop详解
大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战。Hadoop作为一个开源的分布式并行处理平台,以其高拓展、高效率、高可靠等优点越来越受到欢迎。这同时也带动了hadoop商业版的发行。这里就通过大快DKhadoop为大家详细介绍一下hadoop大数据平台架构内容。
用户3391135
2018/10/09
1.2K0
hadoop框架结构学习详述
近年,随着互联网的发展特别是移动互联网的发展,数据的增长呈现出一种爆炸式的成长势头。单是谷歌的爬虫程序每天下载的网页超过1亿个(2000年数据,)数据的爆炸式增长直接推动了海量数据处理技术的发展。谷歌公司提出的大表、分布式文件系统和分布式计算的三大技术构架,解决了海量数据处理的问题。谷歌公司随即将设计思路开源,发表了具有划时代意义的三篇论文,很快根据谷歌设计思路的开源框架就出现了,就是如今非常火爆的hadoop、Maperduce和许多Nosql系统。这三大技术也是整个大数据技术的核心基础。
用户3391135
2018/09/26
5000
hadoop框架结构的说明介绍
近年,随着互联网的发展特别是移动互联网的发展,数据的增长呈现出一种爆炸式的成长势头。单是谷歌的爬虫程序每天下载的网页超过1亿个(2000年数据,)数据的爆炸式增长直接推动了海量数据处理技术的发展。谷歌公司提出的大表、分布式文件系统和分布式计算的三大技术构架,解决了海量数据处理的问题。谷歌公司随即将设计思路开源,发表了具有划时代意义的三篇论文,很快根据谷歌设计思路的开源框架就出现了,就是如今非常火爆的hadoop、Maperduce和许多Nosql系统。这三大技术也是整个大数据技术的核心基础。
IT小白龙
2018/10/15
8370
hadoop框架结构的说明介绍
DKhadoop安装包下载与监控参数说明
前阶段用了差不多两周的时间把DKhadoop的运行环境搭建以及安装的各个操作都介绍了一遍。关于DKhadoop安装包下载也只是顺带说了一下,但好像大快搜索的服务器在更新,新的下载页面还不好用!有好些朋友留言说了大快搜索网站上无法下载。我已经将之前下载的这个版本上传到了网盘了,需要的DKhadoop安装包的朋友可以直接通过网盘下载!
用户3392176
2018/10/30
5730
DKhadoop安装包下载与DKM监控参数说明
前阶段用了差不多两周的时间把DKhadoop的运行环境搭建以及安装的各个操作都介绍了一遍。关于DKhadoop安装包下载也只是顺带说了一下,但好像大快搜索的服务器在更新,新的下载页面还不好用!有好些朋友留言说了大快搜索网站上无法下载。我已经将之前下载的这个版本上传到了网盘了,需要的DKhadoop安装包的朋友可以直接通过网盘下载!
IT小白龙
2018/08/13
9590
DKhadoop安装包下载与DKM监控参数说明
hadoop发行版本之间的区别
Hadoop是一个能够对大量数据进行分布式处理的软件框架。 Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。Hadoop的发行版除了有Apache hadoop外cloudera,hortonworks,mapR,华为,DKhadoop等都提供了自己的商业版本。商业发行版主要是提供了更为专业的技术支持,这对于大型企业更为重要,不同发行版都有自己的一些特点,本文就各发行版做简单对比介绍。
IT小白龙
2018/09/11
1.3K0
hadoop发行版本之间的区别
超详细hadoop系统安装教程(附步骤)
在前几篇的文章中分别就虚拟系统安装、LINUX系统安装以及hadoop运行服务器的设置等内容写了详细的操作教程,本篇分享的是hadoop的下载安装步骤。
IT小白龙
2018/08/03
1.3K0
超详细hadoop系统安装教程(附步骤)
实用贴:hadoop系统下载安装教程
在前几篇的文章中分别就虚拟系统安装、LINUX系统安装以及hadoop运行服务器的设置等内容写了详细的操作教程,本篇分享的是hadoop的下载安装步骤。
用户3392176
2018/10/29
8420
hadoop入门教程之DKH安装环境准备
前几天去参加了一个线下的聚会,参加聚会的基本都是从事互联网工作的。会上有人提到了区块链,从而引发了一场关于大数据方面的探讨。我也是从去年才正式接触大数据,一直在学习hadoop。相信接触过hadoop的人都知道,。单独搭建hadoop里每个组建都需要运行环境、修改配置文件、测试等过程,每个组件几乎都有坑,尤其是让新手甚是苦恼。此前有在微博上与一些博友了解过他们的配置过程,有的配置了好几天愣是没成功。
用户3392176
2018/10/18
3700
Apache Shiro在web开发安全技术中的应用
前阶段就hadoop的分享了一些内容,希望对新手入门的朋友有点帮助吧!对于hadoop新手入门的,还是比较推荐大快搜索的DKHadoop发行版,三节点标准版还是值得拥有的(三节点的标准版是可以免费下载的,与付费版的目前功能一样,只是节点数量不同,对于新手而言三节点的够用了)。正在学习hadoop可以下载一下研究学习之用,也可以留言向我索要!
IT小白龙
2018/09/05
7030
Apache Shiro在web开发安全技术中的应用
DKhadoop大数据平台基础框架的简单介绍
大数据作为当下最为热门的事件之一,其实已经不算是很新鲜的事情了。如果是三五年前在讨论大数据,那可能会给人一种很新鲜的感觉。大数据作为当下最为重要的一项战略资源,已经是越来越得到国家和企业的高度重视,我们从大数据被上升到国家战略层面就可窥见一二!
用户3391135
2018/09/26
6430
大数据hadoop入门之hadoop家族详解
大数据这个词也许几年前你听着还会觉得陌生,但我相信你现在听到hadoop这个词的时候你应该都会觉得“熟悉”!越来越发现身边从事hadoop开发或者是正在学习hadoop的人变多了。作为一个hadoop入门级的新手,你会觉得哪些地方很难呢?运行环境的搭建恐怕就已经足够让新手头疼。如果每一个发行版hadoop都可以做到像大快DKHadoop那样把各种环境搭建集成到一起,一次安装搞定所有,那对于新手来说将是件多么美妙的事情!
用户3392176
2018/10/23
8510
hadoop和spark的区别
学习hadoop已经有很长一段时间了,好像是二三月份的时候朋友给了一个国产Hadoop发行版下载地址,因为还是在学习阶段就下载了一个三节点的学习版玩一下。在研究、学习hadoop的朋友可以去找一下看看(发行版 大快DKhadoop,去大快的网站上应该可以下载到的。)
用户3392176
2018/10/16
7830
hadoop分布式集群环境搭建安装规划
Hadoop分布式集群环境搭建是每个入门级新手都非常头疼的事情,因为你可能花费了很久的时间在搭建运行环境,最终却不知道什么原因无法创建成功。但对新手来说,运行环境搭建不成功的概率还蛮高的。
IT小白龙
2018/07/26
4410
hadoop分布式集群环境搭建安装规划
【学习】Hadoop大数据学习线路图
入门知识 对于我们新手入门学习hadoop的朋友来说,首先了解一下云计算和云计算技术是有必要的。下面先是介绍云计算和云计算技术的: 云计算,是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机和其他设备,主要是基于互联网的相关服务地增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中往往用云来表示电信网,后来也用来表示互联网和底层基础设施的抽象。狭义云计算指IT基础设施的交付和使用模式,指
小莹莹
2018/04/18
1.3K0
【学习】Hadoop大数据学习线路图
学习Hadoop大数据基础框架
什么是大数据?进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB(1MB大约等于一百万字节)、GB(1024MB)、TB(1024GB),一直向上攀升,目前,PB(等于1024TB)级的数据系统已经很常见,随着移动个人数据、社交网站、科学计算、证券交易、网站日志、传感器网络数据量的不断加大,国内拥有的总数据量早已超出 ZB(1ZB=1024EB,1EB=1024PB)级别。
用户3392176
2018/11/14
5970
SQL与NoSQL数据库入门基础知识详解
这几年的大数据热潮带动了一激活了一大批hadoop学习爱好者。有自学hadoop的,有报名培训班学习的。所有接触过hadoop的人都知道,单独搭建hadoop里每个组建都需要运行环境、修改配置文件测试等过程。对于我们这些入门级新手来说简直每个都是坑。国内的发行版hadoop那么多,似乎都没有来填这样的坑?不知道是没法解决,还是没有想到?
IT小白龙
2018/12/19
8400
SQL与NoSQL数据库入门基础知识详解
学习hadoop需要什么基础
“学习hadoop需要什么基础”这已经不是一个新鲜的话题了,随便上网搜索一下就能找出成百上千篇的文章在讲学习hadoop需要掌握的基础。再直接的一点的问题就是——学Hadoop难吗?用一句特别让人无语的话回答就是:难不会,会不难!
IT小白龙
2018/09/07
6350
学习hadoop需要什么基础
DKhadoop添加删除节点的易用性探讨
Hadoop作为搭建大数据处理平台的重要“基石”,关于它的分析和讲解的文章已经有很多了。Hadoop本身是一分布式的系统,因此在安装的时候,需要多每一个节点进行组建的安装。并且由于是开源软件,其安装过程相对比较复杂。这也是很多人在搭建hadoop运行环境时总是不能一次性成功的主要原因。
IT小白龙
2018/08/27
4900
DKhadoop添加删除节点的易用性探讨
什么是大数据
进入本世纪以来,尤其是2010年之后,随着互联网特别是移动互联网的发展,数据的增长呈爆炸趋势,已经很难估计全世界的电子设备中存储的数据到底有多少,描述数据系统的数据量的计量单位从MB(1MB大约等于一百万字节)、GB(1024MB)、TB(1024GB),一直向上攀升,目前,PB(等于1024TB)级的数据系统已经很常见,随着移动个人数据、社交网站、科学计算、证券交易、网站日志、传感器网络数据量的不断加大,国内拥有的总数据量早已超出 ZB(1ZB=1024EB,1EB=1024PB)级别。
用户3391135
2018/11/12
1.2K0
相关推荐
hadoop大数据平台架构之DKhadoop详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验