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

推薦する

MySQL 8.0.11 MSI バージョンのインストールと構成のグラフィック チュートリアル

この記事では、MySQL 8.0.11 MSIバージョンのインストールと設定のチュートリアルを参考ま...

Linux での Nginx 監視の問題

nginxのインストール仮想マシンがインターネットにアクセスできることを確認します。 1. ルートユ...

Javascript クロージャの使用シナリオの原則の詳細

目次1. 終了2. クロージャの使用シナリオ1.タイムアウトを設定する2. コールバック3. 手ぶれ...

MySQL テーブルを作成するためによく使用される SQL ステートメントの概要

最近、私はプロジェクトに取り組んでおり、背景を記述するために SQL ステートメントを使用する必要が...

「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

最近、たまたまこの小さな要件に遭遇しました。昔、JS を使用してこれを処理したことを覚えていますが、...

このようなシェル スクリプトを使用して、多数の MySQL データベースを強制終了します (推奨)

朝早くに電話で起こされました。あるプロジェクトのデータベースがダウンしていて起動できないとのことでし...

CentOS で Mysql を再起動するさまざまな方法 (推奨)

1. rpm パッケージ経由でインストールされた MySQL サービスmysqldを再起動 /et...

ウェブデザイナーのウェブデザイン学習経験とスキルのまとめ

会社の影響力が拡大し、製品が改良され続けるにつれて、関連するイメージデザインもそれに追いつき、徐々に...

VueはGraphVisを使用して無限に拡張された関係グラフを開発します

1. GraphVis 公式サイトにアクセスして、対応する js をダウンロードします。js の新し...

MySQL でのデータベース間クエリの例

序文MySQL では、クロスデータベース クエリは主に 2 つの状況に分けられます。1 つは同じサー...

MySQL でテーブルを削除する 3 つの方法 (要約)

ドロップテーブルドロップはテーブル情報を直接削除するため、最も高速ですが、データを取得することはでき...

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

Windows および Linux での Redis のインストールとデーモン設定

# Windows および Linux 上の Redis のインストール デーモン構成Redis の...

spring-boot と docker-java に基づいて Docker コンテナの動的な管理と監視を実装します [完全なソース コードのダウンロード付き]

Docker入門Docker はオープンソースのアプリケーション コンテナ エンジンです。従来の仮...

Tomcat が localhost に通常アクセスすると 404 を報告する問題の解決方法

今日、プロジェクトのホームページにアクセスするために Tomcat を設定していたところ、404 エ...