Vue は URL に基づいて非同一オリジンのファイルをどのようにダウンロードするのか

Vue は URL に基づいて非同一オリジンのファイルをどのようにダウンロードするのか

一般的に、URL に基づいてファイルをダウンロードする場合、次の 2 つの解決策があります。

1. window.open(url)
2. <a :href="url" rel="external nofollow" download="ファイル名"/>

ただし、開発プロセス中に、バックエンドから返されるファイル アドレスが Web サイトと同じソースからのものではないという状況に遭遇することがあります。上記の 2 つのソリューションを使用して画像、PDF、その他のファイルをダウンロードすると、ブラウザーはダウンロードせずに直接開きます。この状況は次の方法で解決できます。
ファイル関数のカプセル化をダウンロード: (views/util/index.js)

「axios」からaxiosをインポートします。
// ファイルをダウンロードします(クロスドメインダウンロードの問題を解決できます)
エクスポート非同期関数downloadFile(fileUrl, fileName) {
  if (!fileUrl) が return;
  res = axios({ を待ちます
    メソッド: "get",
    url: ファイルURL、
    レスポンスタイプ: "blob"
  });
  newUrl = window.URL.createObjectURL(res.data); とします。
  a = document.createElement("a"); とします。
  新しいUrlを作成します。
  a.download = ファイル名;
  クリック();
  削除();
  //リソースのダウンロードが完了したら、createObjectURL によって占有されているキャッシュ リソースを手動でクリアできます。window.URL.revokeObjectURL(newUrl);
}

使用

<テンプレート>
  <div>
      {{ファイル名}}
      <span
        class="ファイルダウンロード"
        @click="downloadFile(file.url, file.name)"
        >ダウンロード
      >
  </div>
</テンプレート>

<スクリプト>
「@/util/index.js」からダウンロードファイルをインポートします。
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    戻る {
      ファイル:{
          url:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fb.zol-img.com.cn%2Fdesk%2Fbizhi%2Fimage%2F6%2F960x600%2F1426818724752.jpg&refer=http%3A%2F%2Fb.zol-img.com.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1627377638&t=662034e86ff9110854ca0316485e294b',
          名前:「美しい風景」
      }
    };
  },
  作成された() {},
  マウント() {},
  メソッド: {
    ダウンロードファイル
  }
};
</スクリプト>

<style lang="scss" スコープ>

</スタイル>

PS: VueでURLをクリックしてファイルをダウンロードするための最適なソリューション

この種の機能は開発でよく遭遇します。ユーザーがファイルや添付ファイルをサーバーにアップロードし、バックエンドがファイルを FTP またはその他の場所に置きます。フロントエンド ページにダウンロード エントリがあります。バックエンドが BLOB を返すこともありますが、もちろんこれが最善です。ただし、利便性のために、バックエンドがファイルの場所の URL を返すこともあります。このとき、フロントエンドでいくつかの問題が発生する可能性があります。たとえば、ファイルのダウンロード時にブラウザが点滅することがあります。画像、JSON ファイル、およびブラウザでサポートされているその他のファイルをダウンロードする場合、それらはダウンロードされず、ブラウザで直接開かれます。次の方法は、このような問題を完全に解決できます。

解決:

  • カスタム命令のカプセル化
  • URLを太字に変換し、BLOBをダウンロードするためのタグを作成します

コードの実装

  • srcの下のディレクティブフォルダに新しいディレクトリdownload-load-urlを作成します。
  • download-url/index.js ファイル
/*
 * バックエンドはファイルの URL を返し、フロントエンドはそれをダウンロードするためのタグを作成します*
 * 1. ファイルが画像またはブラウザでサポートされている形式の場合、ダウンロードをクリックするとファイルが直接開かれる問題を解決しました。
 * 2. ファイルをダウンロードするときにブラウザがちらつくことがあります*
 * ページ内での使用 * 1. ディレクティブ import downLoad from '@/directive/down-load-url' をインポートします。
 * 2. ディレクティブを登録する:{downLoad}
 * 3. ダウンロード ボタンのコマンドとして使用します。例: <el-button v-downLoad="url">ダウンロード</el-button>
 */

'./downLoad' から downLoad をインポートします

const インストール = 関数(Vue) {
  Vue.directive('downLoadUrl', ダウンロード)
}

downLoad.install = インストール

デフォルトのダウンロードをエクスポート
download-url/downLoad.js ファイルエクスポートデフォルト {
  bind(el, バインディング) {
    el.addEventListener('クリック', () => {
      console.log(binding.value) // url
      定数a = document.createElement('a')
      // let url = baseUrl + binding.value // URLが不完全な場合は、baseURLを連結する必要があります
      const url = binding.value // 完全なURLが直接使用されます // ここでURLをBLOBアドレスに変換します。
      fetch(url).then(res => res.blob()).then(blob => { // リンクアドレスの文字列コンテンツをblobアドレスに変換します。a.href = URL.createObjectURL(blob)
        コンソールログ(a.href)
        a.download = '' // ダウンロードしたファイルの名前// a.download = url.split('/')[url.split('/').length -1] // // ダウンロードしたファイルの名前document.body.appendChild(a)
        クリック()
      })
    })
  }
}

Vue が URL に従って非同一オリジン ファイルをダウンロードする方法についての説明はこれで終わりです。より関連性の高い Vue URL ダウンロード ファイル コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue.jsは画像のURLに従って画像をダウンロードします
  • Vue で URL をクリックしてファイルをダウンロードするための最適なソリューションを共有します

<<:  Centos8 で yum を使用して rabbitmq をインストールするチュートリアル

>>:  MySQL (InnoDB) がデッドロックを処理する方法の詳細な説明

推薦する

つまり、フィルターコレクション

IE は開発の初期段階では頭を悩ませましたが、他のブラウザとは異なります。他のブラウザがサポートして...

JavaScript プリミティブデータ型シンボルの詳細な説明

目次導入説明名前の競合私有財産要約する導入シンボル変数を作成する最も簡単な方法は、Symbol() ...

設定ファイルを変更した後、操作を再開します

余計なことは言わないで、コードだけ見てみましょう〜 # docker-compose をダウン # ...

MySQL 外部キー設定方法の例

1. 外部キーの設定方法1. MySQL では、2 つのテーブルを関連付けるために、外部キー (FO...

Ubuntu 20.04でルートアカウントを有効にする方法

Ubuntu 20.04 をインストールした後、デフォルトでは root アカウントのログイン権限が...

PHPのmail()関数を使用してメールを送信する

PHPのメール関数を使用してメールを送信するmail()関数はメールサーバーに接続し、サーバーと対話...

nginx でディレクトリ ホワイトリストと IP ホワイトリストを設定する方法

1. ディレクトリホワイトリストを設定する:指定されたリクエストパスに制限を設定しないでください。た...

Linux サーバーに埋め込まれた ddgs および qW3xT.2 マイニング ウイルスの対処の実践記録

序文仮想通貨の狂気的な投機により、マイニングウイルスは犯罪者が最も頻繁に使用する攻撃方法の 1 つに...

制限を使用すると、MySQL のページングがどんどん遅くなるのはなぜですか?

目次1. テスト実験2. 制限ページング問題に対するパフォーマンス最適化手法2.1 テーブルをカバー...

MySQLの場合の使用例分析

まず、データベース テーブルを作成します。 テーブル `t_demo` を作成します ( `id` ...

Node.js のイベント モジュールに関する知識ポイントのまとめ

Node の研究と応用を通じて、NodeJS はシングルスレッド、イベント駆動型、非ブロッキング I...

MySQLクライアント認証後の接続失敗の問題に対する完璧なソリューション

MySQL 環境をローカル (192.168.1.152) にデプロイし、リモート クライアント 1...

アニメーションとトランジションの違い

CSS3アニメーションとJSアニメーションの違いJSはフレームアニメーションを実装しますCSS3はト...

表の最初の行と最初の列を固定し、適応型ウィンドウを実現するための CSS の例コード

今日のキャンパス採用筆記試験では、固定された最初の行と最初の列を実装し、幅をウィンドウの変更に適応さ...

Elementはスクリプトを使用して新しいコンポーネントを自動的に構築します

目次背景element-ui の自動構築はどのように機能しますか?メイクファイル新しい.jsファイル...