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 で範囲パーティションを追加および削除する例

推薦する

数字当てゲームを実装するための純粋なJavaScript

100 以内の自然数をランダムに選択し、プレイヤーに 10 ラウンド以内にその数を推測させる数字推...

TomcatはXMLを解析し、リフレクションを通じてオブジェクトを作成します。

次のサンプル コードでは、Tomcat が XML を解析し、リフレクションを通じてオブジェクトを作...

Docker用国産イメージウェアハウスの使い方

1. 問題の説明何らかの理由により、中国でのDockerイメージのダウンロード速度は特に遅くなります...

MySQL にテキストと画像を保存する方法

Oracle の大きなテキスト データ型 Clob 長いテキスト型 (MySQL ではサポートされて...

vue3.0共通コンポーネントの自動インポート方法の例

1. 前提条件インポートには require.context メソッドを使用します。vite で作成...

Visual Studio Codeを使用してMySqlデータベースに接続し、クエリを実行します。

Visual Studio Code は、Microsoft が開発した強力なテキスト エディター...

JavaScript でイベントのバブリングを防ぐ方法

注意すべき点は、イベントバブリング自体の特性上、メリットだけでなくデメリットも生じるということです。...

MySQL外部キーの3つの関係例の詳細な説明

この記事では、例を使用して、MySQL 外部キーの 3 つの関係について説明します。ご参考までに、詳...

Web デザイン ヘルプ: Web フォント サイズ データ リファレンス

<br />内容はインターネットから転載したものです。どこから見つけたのか忘れてしまいま...

docker redis5.0 clusterの実装 クラスタ構築

システム環境: Ubuntu 16.04LTSこの記事では、6 つの Docker コンテナを使用し...

Docker で nginx の https を設定する方法

https をサポートしていない Web サイトは、ブラウザによって徐々に安全でないとマークされるた...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

HTML テーブル タグ チュートリアル (34): 行スパン属性 ROWSPAN

複雑なテーブル構造では、一部のセルが水平方向に複数のセルにまたがるため、行間属性 ROWSPAN を...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

JS でシンプルなデータ監視を実装する方法

目次概要最初のステップステップ2なぜ別の _data が必要なのでしょうか?データにもう少しデータを...