亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

vue+django實現下載文件的示例

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

在項目中,點擊下載按鈕,就可以下載文件。

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

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

二、django項目

本環境使用django 3.1.5,新建項目download_demo

vue+django實現下載文件的示例

安裝模塊

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’, # 注冊應用cors]

注冊中間件

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]

最后一行增加

# 跨域增加忽略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): ''' 文件生成器,防止文件過大,導致內存溢出 :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文件

vue+django實現下載文件的示例

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

三、vue項目

新建一個vue項目,安裝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} 請求數據,參數=>`, 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,用來下載指定的文件。

訪問測試頁面,點擊下載按鈕

vue+django實現下載文件的示例

就會自動下載

vue+django實現下載文件的示例

打開工具欄,查看響應信息

vue+django實現下載文件的示例

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

遇到中文,會進行URLcode編碼。

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

以上就是vue+django實現下載文件的示例的詳細內容,更多關于vue+django實現下載文件的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 国产精品免费一区二区三区四区 | 一道精品视频一区二区三区图片 | 欧美笫一页 | 亚洲一卡二卡在线 | 成人做爰免费视频免费看 | 亚洲国产精品专区 | 久久是免费只精品热在线 | 久久精品视频99精品视频150 | 国产精品二 | 99www综合久久爱com | 大片一级 | 精品成人免费播放国产片 | 国产在线精彩视频 | 九九99国产精品视频 | 久久96精品国产 | 91短视频版在线观看www | 乱人xxx国语对白91 | 一级毛片免费视频网站 | 性生大片一级毛片免费观看 | chinese国产hdfree中文| 1769国产精品免费视频 | 日韩欧美一区二区久久黑人 | 国模大胆偷拍在线视频 | 无内丝袜透明在线播放 | 国产尻逼| 九九精品国产兔费观看久久 | 国产精品免费视频一区 | 爱爱动态视频免费 | 999久久狠狠免费精品 | 日美一级毛片 | 毛片xxxx | 色综合中文字幕 | 欧美成人性生活视频 | 6080午夜一级毛片免费看 | 国产闫盼盼私拍福利精品视频 | 亚洲免费a | 国产欧美日韩不卡在线播放在线 | 国产亚洲精品久久久久久久久激情 | 欧美日韩综合 | 精品国产人成在线 | 日韩精品一区二区三区中文字幕 |