フロントエンドのvueでファイルをダウンロードするいくつかの方法
2022-02-19 23:52:06
最初の方法は、フロントエンドでハイパーリンクを作成し、aタグのリンクからバックエンドのサービスにgetリクエストを送り、バックエンドからファイルのストリームを受け取るというもので、これは非常に簡単です:その方法は
<a :href='"/user/downloadExcel"' >Download template</a>
Another scenario is to create div tags that dynamically create a tags.
<div name="downloadfile" onclick="downloadExcel()">download</div>
function downloadExcel() {
let a = document.createElement('a')
a.href = "/user/downloadExcel"
a.click();
}
There is another addition.
function downloadExcel() {
window.location.href = "/tUserHyRights/downloadUsersUrl";
}
2つ目の方法は、iframeを作成する方法です。
<el-button size="mini" class="filter-item" type="primary" icon="el-icon-download" @click=& quot;handleExport(scope.row)">export</el-button>
//method method.
handleExport(row) {
var elemIF = document.createElement('iframe')
elemIF.src = 'user/downloadExcel?snapshotTime=' + formatDate(new Date(row.snapshotTime), 'yyyy-MM-dd hh:mm') +
'&category=' + row.category
elemIF.style.display = 'none'
document.body.appendChild(elemIF)
}
3つ目の方法は、バックエンドから送信されるpostリクエストにblob形式を使用する方法です。
<el-button size="mini" class="filter-item" type="primary" icon="el-icon-download" @click=& quot;handleExport(scope.row)">export</el-button>
//method method
handleExport(row){
const url="/user/downloadExcel"
const options = {snapshotTime:formatDate(new Date(row.snapshotTime), 'yyyy-MM-dd hh:mm')}
exportExcel(url,options)
}
/**
* Encapsulate a request to export an Excal file
* @param url
* @param data
* @returns {Promise}
*/
//api.js
export function exportExcel(url, options = {}) {
return new Promise((resolve, reject) => {
console.log(`${url} request data, options =>`, JSON.stringify(options))
axios.defaults.headers['content-type'] = 'application/json;charset=UTF-8'
axios({
method: 'post',
url: url, // request address
data: options, // parameters
responseType: 'blob' // indicates the type of data returned by the return server
}).then(
response => {
resolve(response.data)
let blob = new Blob([response.data], {
type: 'application/vnd.ms-excel'
})
console.log(blob)
let fileName = Date.parse(new Date()) + '.xlsx'
if (window.navigator.msSaveOrOpenBlob) {
// console.log(2)
navigator.msSaveBlob(blob, fileName)
} else {
// console.log(3)
var link = document.createElement('a')
link.href = window.URL.createObjectURL(blob)
link.download = fileName
link.click()
//free memory
window.URL.revokeObjectURL(link.href)
}
},
err => {
reject(err)
}
)
})
}
バックエンドが提供するダウンロードインターフェイスがget型であれば、メソッド1と2を直接使うことができるので、簡単で便利です。もちろん、メソッド3を使ってもいいのですが、ちょっと遠回りのような気がします。
バックエンドが提供するダウンロードインターフェイスがpost型の場合、3番目のメソッドを使う必要があります。
関連
-
マウントされたフックでのエラー: "TypeError: TypeError: Cannot read property 'XXXXX' of undefined" マウントされたフックにエラーが発生しました。
-
vueがエラーを報告します。Cannot read property 'xxx' of undefined", but the page renders the data
-
Vue using seven cows cloud upload error o.upload.addEventListener is not function and other error reporting issues.
-
videojs: エラーです。(CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) このメディアと互換性のあるソースは見つかりませんでした。
-
Uncaught (in promise)の解決策、考えられる原因
-
vueプロジェクトでChromeコンソールの非パッシブイベントリスナー出力問題を解決する
-
vueの@のエイリアスがジャンプを認識しない
-
VUE ストリングスプライシング 各種スプライシング
-
vue实现PC端分辨率适配
-
vue reports Error in mounted hook: "SyntaxError: JSON の位置 0 に予期しないトークン u があります".
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedvueがエラーで動作する getaddrinfo ENOTFOUND localhost
-
VUE で未定義のエラーのプロパティ 'length' を読み取ることができません。
-
require(src) は警告を報告するCritical dependency: 依存関係の要求は式である
-
vueのインストール・イメージは、https://registry.npm.taobao.org/cnpmへのエラー・リクエストに失敗したと報告します。理由: getaddrinfo ENOTFOUND regis
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory, scandir 'E:\webnode_modules_nod
-
vue リソースの読み込みに失敗しました:サーバーは404(Not Foun)のステータスで応答しました。
-
vueでechartsを使用する際の問題点。Error Initialize failed invalid dom
-
[Intervention] パッシブイベントリスナー内部で、ターゲットがapparentsとして扱われるため、preventDefaultできない。
-
vue プロジェクトのエラーメッセージ Uncaught ReferenceError: Vueは定義されていません。
-
VueはQRCodeプラグインを使用してQRコードを生成していますが、マウントされたフックでのエラー: "TypeError: nullのプロパティ'appendChild'を読み取れない"