Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

Vue はボタンをクリックしてファイルをダウンロードする操作コードを実装します (バックエンド Java)

前回の記事では、ボタンをクリックしてファイルをダウンロードするVueの機能を紹介しました。今日は、ボタンをクリックしてファイルをダウンロードするVueの話題の続きをしたいと思います。

最近のプロジェクトでは、ボタンをクリックしてファイルをダウンロードするという要件を実現する必要があります。ファイルは画像、PDF、Word などさまざまなタイプであるため、フロントエンドには Vue が使用されます。ここで、バックエンドはファイルのアドレスをフロントエンドに返すことができますが、インターネット上でさまざまな回答を見た後、どれも私が望むものではないと感じています。

ファイルの種類が不明なため、ファイルをデータベースに保存するときには、ファイルの Content-Type を保存する必要があります。こうすることで、データベースからファイルを取得してフロントエンドに返すときに、Content-Type によってファイルのタイプが識別され、フロントエンドで解析できるようになります。

1. バックエンドコード

ここでは、まずバックエンド インターフェイスを記述し、バックエンドに何が必要かを検討します。ファイル情報は事前にデータベースに保存されているため、ファイル情報を取得するには主キー ID を渡すだけで済みます。パラメータを決定したら、戻り値の型を決定する必要があります。ここで ResponseEntity を使用して返すことができます。 ResponseEntity は、ステータス コード、応答ヘッダー情報、応答コンテンツなど、一度に複数の情報を返すことができます。

では早速、コードを見てみましょう。

/**
 * 添付ファイルをダウンロード * @param attachmentId
 * @戻る
 */
パブリックResponseEntity<byte[]>ダウンロード(Long attachmentId) {
    // 添付ファイルが存在するかどうかを確認します SysAttachment sysAttachment = sysAttachmentMapper.selectSysAttachmentById(attachmentId);
    StringUtils.isNull(sysAttachment) の場合 {
        null を返します。
    }

    ByteArrayOutputStream bos = null;
    入力ストリーム ins = null;
    試す {
        文字列 fileName = sysAttachment.getOrgFileName();
        文字列 ossFileName = sysAttachment.getUrl();
        bos = 新しい ByteArrayOutputStream();
        ins = OssUtils.getInstance().getObject(ossFileName).getObjectContent();
        // ストリームからデータを取得します int len ​​= 0;
        byte[] buf = 新しいbyte[256];
        ((len = ins.read(buf, 0, 256)) > -1) の場合 {
            bos.write(buf, 0, len);
        }

        // 中国語の文字化けを防ぐ fileName = URLEncoder.encode(fileName, "utf-8");
        // レスポンス ヘッダーを設定します HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment;filename=" + fileName);
        headers.add("Content-Type", sysAttachment.getContentType());
        // 応答を設定します HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> レスポンス = 新しい ResponseEntity<byte[]>(bos.toByteArray(), ヘッダー、ステータスコード);
        応答を返します。
    } キャッチ (例外 e) {
        新しい CustomException をスローします ("ダウンロードに失敗しました");
    ついに
        試す {
            (ins != null)の場合{
                ins.close();
            }
            bos != null の場合 {
                bos.close();
            }
        } キャッチ (例外 e) {
            新しい CustomException をスローします ("ダウンロードに失敗しました");
        }
    }
}

ここでは、データベースからファイルの URL を取得し、Alibaba Cloud OSS を介してファイルの入力ストリームを取得します。次に、ファイルをバイナリとして出力し、ResponseEntity にカプセル化し、ファイルタイプを Content-Type に設定します。同時に、ファイル名に中国語の文字化けが含まれないように、UTF-8 エンコーディングを設定します。これで、バックエンドインターフェースが完成しました。

上記の情報に基づいて、データベースにファイル情報を保存するときは、少なくともファイルの URL (通常は OSS にアップロードした後に提供されます)、ファイルの種類、元のファイル名、ファイル サイズなどのフィールドを保存する必要があります。

2. フロントエンドコード

バックエンドインターフェースが完成したら、次のステップはフロントエンドです。ここでは、ファイルのダウンロード方法を一般的な方法にカプセル化してグローバルにマウントし、必要な場所で直接使用することができます。

異なるファイルを識別する必要があるため、異なるファイルを表すキーと値のペアが必要です。

定数 mimeMap = {
  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  xls: 'application/vnd.ms-excel',
  zip: 'アプリケーション/zip',
  jpg: '画像/jpg',
  jpeg: '画像/jpeg',
  png: '画像/png',
  ドキュメント: 'application/msword',
  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
  ppt: 'application/vnd.ms-powerpoint',
  txt: 'テキスト/プレーン'、
  pdf: 'アプリケーション/pdf'
}

必要に応じてさらに追加し続けることができます。次のステップはリクエストを送信することです。ここでの戻り値の型は blob に設定し、axios を使用して直接送信できます。

/**
 * 添付ファイルをダウンロード* @param パス インターフェース アドレス* @param param リクエスト パラメータ*/
エクスポート関数downloadAttachment(path, param) {
  var url = baseUrl + パス + パラメータ
  アクシオス({
    メソッド: 'get'、
    URL: URL、
    レスポンスタイプ: 'blob',
    ヘッダー: { 'Authorization': getToken() }
  }).then(res => {
    解決Blob(res、res.data.type)
  })
}

インターフェース アドレスと要求パラメータは外部から渡されます。トークンも必要です。そうしないと、クロスドメイン アクセスが発生します。バックエンドから返されたデータを取得したら、バイナリ ファイルを解析する必要があります。ここでは、resolveBlob メソッドを定義します。このメソッドには、返されるオブジェクトとファイル タイプという 2 つのパラメーターがあります。バックエンドで既にファイル タイプを Content-Type に設定しているので、ここではそれを使用します。

/**
 * BLOB 応答コンテンツを解析してダウンロードします * @param {*} res BLOB 応答コンテンツ * @param {String} mimeType MIME タイプ */
エクスポート関数resolveBlob(res, mimeType) {
  定数 aLink = document.createElement('a')
  var blob = 新しい Blob([res.data], { タイプ: mimeType })
  // レスポンス ヘッダーからファイル名を取得し、バックエンドでファイル名を設定します。 response.setHeader("Content-disposition", "attachment; filename=xxxx.docx");
  var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  var contentDisposition = decodeURI(res.headers['content-disposition'])
  var 結果 = patt.exec(contentDisposition)
  var ファイル名 = 結果[1]
  ファイル名 = ファイル名.replace(/\"/g, '')
  aLink.href = URL.createObjectURL(blob)
  aLink.setAttribute('download', fileName) // ダウンロードファイル名を設定する document.body.appendChild(aLink)
  リンクをクリックする()
  document.body.removeChild(リンク);
}

このコードを詳しく説明する必要はありません。フロントエンドの専門家なら自然に理解できるでしょう。これでフロントエンドとバックエンドのコードが完成しました。

3. 使用

さらに使いやすくなりました。まずグローバルにマウントする

「@/utils/download」から{downloadAttachment}をインポートします。
Vue.prototype.downloadAttac = ダウンロード添付ファイル

使用する場所に直接呼び出すだけです

<el-ボタン
    タイプ="テキスト"
    アイコン="el-icon-download"
    サイズ="ミニ"
    @click="AttachRow(scope.row.attachmentId) をダウンロード"
    </el-button>

/** 添付ファイルをダウンロード */
ダウンロードAttachRow(アタッチID) {
    this.$confirm('ファイルをダウンロードしてもよろしいですか?', "警告", {
        confirmButtonText: "確認",
        cancelButtonText: 「キャンセル」、
        タイプ: 「警告」
    }).then(() => {
        this.downloadAttac('/system/attachment/download/', アタッチID)
    }).then(() => {
        this.msgSuccess("ダウンロードに成功しました")
    }).catch(() => {})
}

これで終わりです。

これで、ボタンをクリックしてファイルをダウンロードするための Vue の操作コード (バックエンド Java) に関するこの記事は終了です。ボタンをクリックしてファイルをダウンロードするための Vue の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueはボタンをクリックしてファイルをダウンロードする機能を実装します
  • Vueはボタンをクリックして背景色を切り替えるサンプルコードを実装します
  • Vue クリックボタンでコンポーネント関数を動的に作成および削除する
  • Vue を使用して Alibaba Cloud OSS の URL 接続を介してファイルを直接ダウンロードし、ファイル名を変更する方法
  • Vueはファイルストリームをダウンロードするための完全なフロントエンドとバックエンドのコードを実装します

<<:  Linux でパスワードの有効期限を表示および設定する方法

>>:  MySQL インデックスの長さ制限の原理の分析

推薦する

LinuxにMySQLをインストールするための詳細なチュートリアル

すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...

Vue3 の ref と toRef の違いを簡単に分析します

1. refがコピーされ、ビューが更新されますrefを使用してオブジェクトのプロパティ値をレスポンシ...

Dockerコンテナのk8sデプロイメントの実装

環境: (docker、k8s クラスター)、前回 docker で起動した Java プログラムの...

Linuxロスレス展開方法

概要クラウド プラットフォームのお客様のサーバーでは、業務量が拡大し続けるとディスク容量が不足する場...

Docker で MySQL マスター スレーブ レプリケーションを実装するためのサンプル コード

目次1. 概要1. 原則2. 実装3. スレーブインスタンスを作成する4. マスタースレーブ構成要約...

Vue3 の動的コンポーネントはどのように機能しますか?

目次1. コンポーネントの登録1.1 グローバル登録1.2 グローバルコンポーネントの登録プロセス1...

RocketMQ の Docker インストールとインストール中に発生した問題の解決策

目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...

JavaScript の instanceof メソッドの手動実装

1. instanceofの使用法instanceof演算子は、コンストラクター関数のprototy...

Dockerを使用してphabricatorをインストールする方法

ここでは Ubuntu 16.04 システムを使用しています。 dockerを使用したインストールh...

ログインボックスのメールプロンプトを実装するネイティブJS

この記事では、登録またはログイン時に電子メール アドレスを入力する際のドロップダウン プロンプトのネ...

jQueryはシャトルボックス効果を実現します

この記事では、シャトルボックス効果を実現するためのjQueryの具体的なコードを参考までに紹介します...

MySQL は、現在のデータ テーブル内のすべての時間に対して指定された時間間隔を増加または減少させます (推奨)

DATE_ADD() 関数は、指定された時間間隔を日付に追加します。現在のテーブル内のすべてのデー...

データベースの冗長フィールドを合理的に使用する方法

privot は、多対多の関係の中間テーブルです。 PT5 フレームワークは自動的に privot ...

NODE.JS を使用して WEBSERVER を作成する手順

目次Node.jsとはNodeJSをインストールするNode を使用して Hello World を...

React+tsは二次リンク効果を実現します

この記事では、二次リンク効果を実現するためのReact+tsの具体的なコードを参考までに共有します。...