vue+django でファイルをダウンロードする例

vue+django でファイルをダウンロードする例

1. 概要

プロジェクトで、ダウンロード ボタンをクリックしてファイルをダウンロードします。

従来のダウンロード リンクは一般に get リンクであり、公開されており、自由にダウンロードできます。

実際のプロジェクトでは、ダウンロード リンクの一部は非公開になっています。ダウンロードするには、post メソッドを使用して正しいパラメータを渡す必要があります。

2. Django プロジェクト

この環境ではDjango 3.1.5を使用し、新しいプロジェクトdownload_demoを作成します。

モジュールのインストール

pip3 インストール djangorestframework django-cors-headers

download_demo/settings.pyファイルを変更します。

インストール済みアプリ = [
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'api.apps.ApiConfig',
 'corsheaders', # アプリケーション cors を登録する
]

ミドルウェアの登録

ミドルウェア = ​​[
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.認証ミドルウェア',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'corsheaders.middleware.CorsMiddleware'、# コンポーネント cors を登録する
]

最後の行は

#クロスドメイン追加は CORS_ALLOW_CREDENTIALS = True を無視します
CORS_ORIGIN_ALLOW_ALL = 真

CORS_ALLOW_METHODS = (
 '得る'、
 「オプション」、
 'パッチ'、
 '役職'、
 'ビュー'、
)

CORS_ALLOW_HEADERS = (
 'XMLHttpリクエスト',
 'X_ファイル名',
 'エンコードを受け入れる'、
 「承認」、
 'コンテンツタイプ'、
 'しない'、
 '起源'、
 'ユーザーエージェント'、
 'x-csrftoken',
 'x-リクエスト',
 「プラグマ」、
)

download_demo/urls.py を変更する

django.contribからadminをインポート
django.urls インポートパスから
API インポートビューから

urlパターン = [
 パス('admin/', admin.site.urls),
 パス('download/excel/', views.ExcelFileDownload.as_view()),
]

api/views.py を変更する

django.shortcuts から render,HttpResponse をインポートします
download_demo からインポート設定
django.utils.encoding から escape_uri_path をインポートします
django.http から StreamingHttpResponse をインポートします
django.http から JsonResponse をインポートします
rest_framework.views から APIView をインポートします
rest_framework からインポートステータス
インポートOS

クラス ExcelFileDownload(APIView):
 def post(self,request):
  リクエストデータを印刷する
  # ファイル名 = "Big River.xlsx"
  ファイル名 = request.data.get("ファイル名")
  download_file_path = os.path.join(settings.BASE_DIR, "アップロード", ファイル名)
  print("ダウンロードファイルパス",ダウンロードファイルパス)

  レスポンス = self.big_file_download(download_file_path, ファイル名)
  応答の場合:
   応答を返す

  JsonResponse を返します({'status': 'HttpResponse', 'msg': 'Excel のダウンロードに失敗しました'})

 def file_iterator(self,file_path,chunk_size=512):
  「」
  ファイルが大きくなりすぎてメモリ オーバーフローが発生するのを防ぐためのファイル ジェネレーター:param file_path: 絶対ファイル パス:param chunk_size: チャンク サイズ:return: generator """
  open(file_path, mode='rb') を f として実行します:
   真の場合:
    c = f.read(チャンクサイズ)
    cの場合:
     収量 c
    それ以外:
     壊す

 def big_file_download(self,download_file_path, ファイル名):
  試す:
   レスポンス = StreamingHttpResponse(self.file_iterator(download_file_path))
   # ヘッダーを追加する
   レスポンス['Content-Type'] = 'application/octet-stream'
   response['Access-Control-Expose-Headers'] = "Content-Disposition、Content-Type"
   response['Content-Disposition'] = "添付ファイル; ファイル名={}".format(escape_uri_path(ファイル名))
   応答を返す
  例外を除く:
   return JsonResponse({'status': status.HTTP_400_BAD_REQUEST, 'msg': 'Excel のダウンロードに失敗しました'},
        ステータス = status.HTTP_400_BAD_REQUEST)

プロジェクトのルートディレクトリにアップロードファイルを作成する

Excelファイル(例:Great Rivers.xlsx)を入れます。

3. Vueプロジェクト

新しい vue プロジェクトを作成し、ElementUI モジュールをインストールします。

新しいtest.vueを作成する

<テンプレート>
 <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>
</テンプレート>

<スクリプト>
 'axios' から axios をインポートします

 エクスポートデフォルト{
 データ() {
  戻る {
  }
 },
 マウント: 関数() {

 },
 メソッド: {
  ダウンロードファイル(url, オプション = {}){
  新しい Promise を返します ((resolve, reject) => {
   // console.log(`${url} リクエストデータ、パラメータ=>`、JSON.stringify(options))
   // axios.defaults.headers['content-type'] = 'application/json; charset=UTF-8'
   アクシオス({
   メソッド: 'post'、
   url: url, // リクエストアドレス data: options, // パラメータ responseType: 'blob' // サーバーから返されるデータ型を示します}).then(
   レスポンス => {
    // console.log("ダウンロード応答",response)
    解決(応答データ)
    blob = new Blob([response.data], {
    タイプ: 'application/vnd.ms-excel'
    })
    // コンソール.log(blob)
    // ファイル名を Date.parse(new Date()) + '.xlsx' とします
    // ファイル名を切り取る let fileNameEncode = response.headers['content-disposition'].split("filename=")[1];
    // デコード let fileName = decodeURIComponent(fileNameEncode)
    // console.log("ファイル名",ファイル名)
    if (window.navigator.msSaveOrOpenBlob) {
    // コンソール.log(2)
    navigator.msSaveBlob(blob、ファイル名)
    } それ以外 {
    // コンソール.log(3)
    var リンク = document.createElement('a')
    link.href = window.URL.createObjectURL(blob)
    link.download = ファイル名
    リンク.クリック()
    //メモリを解放 window.URL.revokeObjectURL(link.href)
    }
   },
   エラー => {
    拒否(エラー)
   }
   )
  })
  },
  // ファイルをダウンロード downFile(){
  postUrl = "http://127.0.0.1:8000/download/excel/" とします。
  パラメータ = {
   ファイル名: "Big River.xlsx",
  }
  // console.log("ダウンロードパラメータ",params)
  this.downloadFile(postUrl,パラメータ)
  },
 }
 }
</スクリプト>

<スタイル>
</スタイル>

注: ここでは POST リクエストが使用され、ファイル名が API に送信され、指定されたファイルがダウンロードされます。

テストページにアクセスし、ダウンロードボタンをクリックします。

自動的にダウンロードされます

ツールバーを開いて応答情報を表示します

ここで、これは Django が返すファイル名であり、ブラウザがダウンロードして保存するファイル名もこれです。

中国語の文字が見つかった場合、URL コードでエンコードされます。

そのため、vue コードでは、Content-Disposition がカットされ、ファイル名が取得されます。

上記は、vue+django でファイルをダウンロードする例の詳細です。vue+django でファイルをダウンロードする詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • Vue を使用して Alibaba Cloud OSS の URL 接続を介してファイルを直接ダウンロードし、ファイル名を変更する方法
  • Springboot+vueでページダウンロードファイルを実現
  • ファイルのアップロードとダウンロードを実現する Springboot+vue
  • Vueはファイルストリームをダウンロードするための完全なフロントエンドとバックエンドのコードを実装します
  • Vue を使用してファイル/画像を zip で一括ダウンロードする方法のチュートリアル
  • vue - ファイル ストリーム BLOB 形式でのファイル操作のダウンロードとエクスポート
  • Vue で axios を使用して、バイナリ ストリーム ダウンロード ファイルを取得するための post メソッドを実装します (サンプル コード)
  • Vue Excel アップロード プレビューとテーブル コンテンツを Excel ファイルへダウンロード
  • Springboot はファイルのアップロードとダウンロードに vue を統合します
  • Vue は PDF ファイルのオンライン プレビューとダウンロードを実装します (pdf.js)
  • Vueはボタンをクリックしてファイルをダウンロードする機能を実装します

<<:  Linux カーネル デバイス ドライバー アドレス マッピングに関する注意事項

>>:  MySQL 5.5 で範囲パーティションを追加および削除する例

推薦する

Rabbitmq heartbea ハートビート検出メカニズムの原理の分析

序文RabbitMQ を使用する場合、一定期間クライアントと RabbitMQ サーバーの間でトラフ...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

Linux での scp および sftp コマンドの詳細な説明

目次序文1. SCPの使用法2. sftpを使用する3. scp と sftp の違いは何ですか?ど...

MySQL 外部キー制約の詳細な説明

公式ドキュメント: https://dev.mysql.com/doc/refman/5.7/en/...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...

MySQL マルチバージョン同時実行制御 MVCC の基本原理の分析

目次1 トランザクションの同時実行で発生する問題1.1 ダーティリード1.2 繰り返し不可能な読み取...

JavaScript offsetParent のケーススタディ

1. offsetParentの定義: offsetParentは子要素に最も近い位置に配置された親...

Javascriptはセキュリティ検証に整合性属性を使用します

目次1. スクリプトタグを使用してファイルをインポートする1. ローカルファイルをインポートする2....

Kubernetesでポッドを作成する方法

目次ポッドを作成するには? kubectl ツールポッドを作成するには?前回の記事では、コンテナとポ...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

Dockerコンテナに入る方法と出る方法

1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...

CSS で垂直方向の中央揃えを行う 7 つの方法の詳細なコード例

レイアウトを編集するとき、通常は水平センタリングと垂直センタリングを使用してデザインします。水平セン...

MySQL データ挿入最適化メソッドconcurrent_insert

スレッドがテーブルに対して DELAYED ステートメントを実行するときに、そのようなハンドラーが存...

Nginxを使ってサーバー内で複数コンテナの共存を実現する方法

背景Tencent Linux クラウド ホストがあり、その上に Docker (ServiceDo...

Vue の get リクエストと post リクエストの違いのまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...