电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

vue+django實(shí)現(xiàn)下載文件的示例

瀏覽:8日期:2022-10-01 17:26:04
一、概述

在項(xiàng)目中,點(diǎn)擊下載按鈕,就可以下載文件。

傳統(tǒng)的下載鏈接一般是get方式,這種鏈接是公開的,可以任意下載。

在實(shí)際項(xiàng)目,某些下載鏈接,是私密的。必須使用post方式,傳遞正確的參數(shù),才能下載。

二、django項(xiàng)目

本環(huán)境使用django 3.1.5,新建項(xiàng)目download_demo

vue+django實(shí)現(xiàn)下載文件的示例

安裝模塊

pip3 install djangorestframework django-cors-headers

修改文件download_demo/settings.py

INSTALLED_APPS = [ ’django.contrib.admin’, ’django.contrib.auth’, ’django.contrib.contenttypes’, ’django.contrib.sessions’, ’django.contrib.messages’, ’django.contrib.staticfiles’, ’api.apps.ApiConfig’, ’corsheaders’, # 注冊(cè)應(yīng)用cors]

注冊(cè)中間件

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’, # 注冊(cè)組件cors]

最后一行增加

# 跨域增加忽略CORS_ALLOW_CREDENTIALS = TrueCORS_ORIGIN_ALLOW_ALL = TrueCORS_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

from django.contrib import adminfrom django.urls import pathfrom api import viewsurlpatterns = [ path(’admin/’, admin.site.urls), path(’download/excel/’, views.ExcelFileDownload.as_view()),]

修改api/views.py

from django.shortcuts import render,HttpResponsefrom download_demo import settingsfrom django.utils.encoding import escape_uri_pathfrom django.http import StreamingHttpResponsefrom django.http import JsonResponsefrom rest_framework.views import APIViewfrom rest_framework import statusimport osclass 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): ''' 文件生成器,防止文件過大,導(dǎo)致內(nèi)存溢出 :param file_path: 文件絕對(duì)路徑 :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)

在項(xiàng)目根目錄創(chuàng)建upload文件

vue+django實(shí)現(xiàn)下載文件的示例

里面放一個(gè)excel文件,比如:大江大河.xlsx

三、vue項(xiàng)目

新建一個(gè)vue項(xiàng)目,安裝ElementUI 模塊即可。

新建test.vue

<template> <div style='width: 70%;margin-left: 30px;margin-top: 30px;'> <el-button 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} 請(qǐng)求數(shù)據(jù),參數(shù)=>`, JSON.stringify(options)) // axios.defaults.headers[’content-type’] = ’application/json;charset=UTF-8’ axios({ method: ’post’, url: url, // 請(qǐng)求地址 data: options, // 參數(shù) responseType: ’blob’ // 表明返回服務(wù)器返回的數(shù)據(jù)類型 }).then( response => { // console.log('下載響應(yīng)',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() //釋放內(nèi)存 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('下載參數(shù)',params) this.downloadFile(postUrl,params) }, } }</script><style></style>

注意:這里使用post請(qǐng)求,并將filename傳輸給api,用來下載指定的文件。

訪問測(cè)試頁面,點(diǎn)擊下載按鈕

vue+django實(shí)現(xiàn)下載文件的示例

就會(huì)自動(dòng)下載

vue+django實(shí)現(xiàn)下載文件的示例

打開工具欄,查看響應(yīng)信息

vue+django實(shí)現(xiàn)下載文件的示例

這里,就是django返回的文件名,瀏覽器下載保存的文件名,也是這個(gè)。

遇到中文,會(huì)進(jìn)行URLcode編碼。

所以在vue代碼中,對(duì)Content-Disposition做了切割,得到了文件名。

以上就是vue+django實(shí)現(xiàn)下載文件的示例的詳細(xì)內(nèi)容,更多關(guān)于vue+django實(shí)現(xiàn)下載文件的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
主站蜘蛛池模板: 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 河南档案架,档案密集架,手动密集架,河南密集架批发/报价 | 螺杆泵_中成泵业| 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 回转窑-水泥|石灰|冶金-巩义市瑞光金属制品有限责任公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 缝纫客| 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | BHK汞灯-百科|上海熙浩实业有限公司| 货车视频监控,油管家,货车油管家-淄博世纪锐行电子科技 | 精密模具制造,注塑加工,吹塑和吹瓶加工,EPS泡沫包装生产 - 济南兴田塑胶有限公司 | 博博会2021_中国博物馆及相关产品与技术博览会【博博会】 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 工作服定制,工作服定做,工作服厂家-卡珀职业服装(苏州)有限公司 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 广域铭岛Geega(际嘉)工业互联网平台-以数字科技引领行业跃迁 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 长信科技产业园官网_西安厂房_陕西标准工业厂房 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 防爆正压柜厂家_防爆配电箱_防爆控制箱_防爆空调_-盛通防爆 |