最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年03月19日 14:13:32   作者:py3study  
這篇文章主要介紹了vue+django實(shí)現(xiàn)下載文件的示例,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下

一、概述

在項(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

安裝模塊

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', # 注冊應(yīng)用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 = 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

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

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):
  """
  文件生成器,防止文件過大,導(dǎo)致內(nèi)存溢出
  :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)

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

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

三、vue項(xiàng)目

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

新建test.vue

<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} 請求數(shù)據(jù),參數(shù)=>`, JSON.stringify(options))
   // axios.defaults.headers['content-type'] = 'application/json;charset=UTF-8'
   axios({
   method: 'post',
   url: url, // 請求地址
   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請求,并將filename傳輸給api,用來下載指定的文件。 

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

就會自動下載

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

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

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

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

以上就是vue+django實(shí)現(xiàn)下載文件的示例的詳細(xì)內(nèi)容,更多關(guān)于vue+django實(shí)現(xiàn)下載文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue自定義指令學(xué)習(xí)及應(yīng)用詳解

    Vue自定義指令學(xué)習(xí)及應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了Vue中自定義指令的學(xué)習(xí)以及如何利用Vue制作一個簡單的學(xué)生信息管理系統(tǒng),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Vue3中watch的用法與最佳實(shí)踐指南

    Vue3中watch的用法與最佳實(shí)踐指南

    這篇文章主要給大家介紹了關(guān)于Vue3中watch用法與最佳實(shí)踐的相關(guān)資料,watch的作用可以監(jiān)控一個值的變換,并調(diào)用因?yàn)樽兓枰獔?zhí)行的方法,可以通過watch動態(tài)改變關(guān)聯(lián)的狀態(tài),需要的朋友可以參考下
    2021-07-07
  • vue實(shí)現(xiàn)自定義全局右鍵菜單

    vue實(shí)現(xiàn)自定義全局右鍵菜單

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)自定義全局右鍵菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue-element-admin平臺側(cè)邊欄收縮控制問題

    Vue-element-admin平臺側(cè)邊欄收縮控制問題

    這篇文章主要介紹了Vue-element-admin平臺側(cè)邊欄收縮控制問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue h5移動端禁止縮放代碼

    vue h5移動端禁止縮放代碼

    今天小編就為大家分享一篇vue h5移動端禁止縮放代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vscode中eslint配置保存自動修復(fù)代碼示例詳解

    vscode中eslint配置保存自動修復(fù)代碼示例詳解

    vscode根據(jù)eslint保存?動修復(fù)配置,下面這篇文章主要給大家介紹了關(guān)于vscode中eslint配置保存自動修復(fù)代碼的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • VSCode搭建Vue項(xiàng)目的方法

    VSCode搭建Vue項(xiàng)目的方法

    這篇文章主要介紹了VSCode搭建Vue項(xiàng)目的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vue中el-table表格的表頭操作代碼

    vue中el-table表格的表頭操作代碼

    本文通過實(shí)例代碼介紹對el-table表格的表頭操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Vue實(shí)現(xiàn)文本展開收起功能

    Vue實(shí)現(xiàn)文本展開收起功能

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)文本展開收起功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Vue雙向數(shù)據(jù)綁定原理解析

    詳解Vue雙向數(shù)據(jù)綁定原理解析

    本篇文章主要介紹了詳解Vue雙向數(shù)據(jù)綁定原理解析 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09

最新評論

伊金霍洛旗| 湾仔区| 临沂市| 包头市| 廉江市| 天门市| 佛教| 北票市| 湘潭县| 马关县| 紫金县| 永德县| 容城县| 张家口市| 宝应县| 宜阳县| 新建县| 河池市| 会理县| 应城市| 浮梁县| 兴安盟| 手机| 特克斯县| 永宁县| 裕民县| 山丹县| 固原市| 新丰县| 舒兰市| 榆中县| 兰州市| 德兴市| 吉林省| 盈江县| 黄山市| 朝阳区| 托里县| 五河县| 灵丘县| 沂水县|