前回の記事では、ボタンをクリックしてファイルをダウンロードする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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Linux でパスワードの有効期限を表示および設定する方法
目次1.配列を初期化する2. 配列の合計、最大値、最小値3. エラー値をフィルタリングする4. 論理...
WIN10 64ビットに最新のMySQL8.0.18をインストールダウンロード公式サイトから最新バ...
目次1. フロントエンドのリーディングプロセス: 2. プラグインの使用と初期化2.1 vue-ad...
序文ORDER BY 字段名升序/降序、このソートステートメントは皆さんご存知だと思いますが、特殊な...
簡単な説明<br />IE6および7では、一般的なaタグ(HTMLで記述され、DOM操作...
私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...
導入Docker-Compose プロジェクトは、Docker コンテナ クラスターの迅速なオーケス...
最近、私たちの小さなチームは、サーバー上の共有フォルダーを共有して、全員がパブリックリソースドキュメ...
皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...
目次メッセージボード必要なライブラリオープンソースプロジェクトプロジェクト構造メッセージボードnod...
目次cgroupとはcgroupの構成cgroupが提供する機能cgroup 内の CPU を制限す...
では、早速スクリーンショットを実行してみましょう。黒い駒はプレイヤーの位置、赤い駒はコンピュータの位...
一般的な基本グラフィックと私が遭遇するいくつかの小さなアイコンについて簡単に説明します。以下は CS...
1. バックアップスクリプトを書く 著者:www.yumi-info.com 日付:20171222...
1. mysql-8.0.21-winx64を解凍する2. 環境変数を設定し、アドレスをbinフォル...