Vue で axios を使用して画像をアップロードするときに発生する問題

Vue で axios を使用して画像をアップロードするときに発生する問題

FormDataとは何ですか?

いろいろ検索して調べた結果、この魔法のようなものは、2008 年 2 月に提案された XMLHttpRequest Level 2 に追加された新しいオブジェクトだということがわかりました。これを使用して、フォームを送信したり、フォーム送信をシミュレートしたりできます。もちろん、最大の利点は、バイナリ ファイルをアップロードし、すべてのフォーム要素の名前と値を queryString に結合してバックグラウンドに送信できることです。

重要なポイント: すべてのフォーム要素の名前と値を queryString に結合し、バックエンドに送信できます。これはバックエンドがデータ形式を変換することを呼んでいるのではないですか? 形式に従って送信してください。フロントエンドとバックエンドの分離は非同期送信である必要があり、これによりこの問題を非常にうまく解決できます。

使い方もとても簡単です。フォームをパラメータとして FormData コンストラクターに渡すだけです。

vueとaxiosの協力による実践的な体験

<!--
    *. ここで使用する vue コンポーネントのアップロード コンポーネントは、buefy の vue コンポーネントです -->

<フォームメソッド="post" enctype="multipart/form-data">
    <b-field class="file is-primary" :class="{'has-name': !!file}">
        <b-upload v-model="file" class="file-label" @input="getModifyAvatar()">
            <span class="file-cta">
                <b-icon class="file-icon" icon="アップロード"></b-icon>
                <span class="file-label">クリックしてアップロード</span>
            </span>
            <span class="ファイル名" v-if="ファイル">
                {{ ファイル名 }}
            </span>                    
       </b-アップロード>
   </b-フィールド>
</フォーム>

<スクリプト>
    エクスポートデフォルト{
        データ(){
            戻る {
                userInfo: '', // get リクエストを通じてユーザー関連情報を割り当てます file: null,
            }
        },
        メソッド: {
            // アバターを変更する getModifyAvatar(){
                フォームデータを作成します。
                //formData を構築します。data formData.append('avatar', this.file)
                // PUTリクエストを送信 getModifyInfo(formData).then(res => {
                    this.userInfo.avatar = res.data.avatar
                })
            },
        }
    }
</スクリプト>
// api.js
// これはカプセル化されたグローバルリクエストメソッドです import { request } from '../network/request'

// ユーザーアバターを変更する export const getModifyInfo = (params) => {
    リクエストを返す({
        URL: 've_register/1/',
        メソッド: 'put'、
        ヘッダー: { 'Content-Type': 'multipart/form-data' },
        データ:パラメータ
    })
}

上記のコードを見ると、リクエストを送信するときにリクエスト ヘッダーを設定する必要があることに注意してください。上記のように、HTML フォームで enctype="multipart/form-data" も設定する必要があります。そうしないと機能しません。

上記の例では、FormData の append() メソッドのみを使用しました。インターネット上の FormData に関する記事のほとんどは、append() メソッドのみについて言及しています。では、FormData オブジェクトにはどのようなメソッドがあるのでしょうか。実際、コンソールを使用するだけで確認できます。

コンソールの後には、重要な発見があります。FormData オブジェクトには非常に多くのメソッドがあるため、真実を知るには自分でテストする必要があります。以下では、これらのメソッドを 1 つずつ説明します。

追加()

append() メソッドは、FormData オブジェクトにキーと値のペアを追加するために使用されます。

fd.append('キー1'、"値1");
fd.append('キー2'、"値2");

fd は FormData オブジェクトであり、新しく作成された空のオブジェクト、またはフォームやその他のキーと値のペアが既に含まれたオブジェクトにすることができます。

セット()

キーに対応する値を設定します

fd.set('キー1'、"値1");
fd.set('キー2'、"値2");

append() メソッドは多少似ています。2 つの違いは、指定されたキー値が存在する場合、append() メソッドは新しく追加されたすべてのキーと値のペアを末尾に追加するのに対し、set() メソッドは以前に設定されたキーと値のペアを上書きすることです。例と比較してみましょう。前の形式に基づいて、新しいキーと値のペアを append() または set() します。

fd.append('name',"will");

キー名を持つキーと値のペアが 2 つあります。

上記はappend()とset()の違いです。キー値が存在しない場合は、2 つの効果は同じになります。

消去()

削除するキー値の名前を示すパラメータを受け取ります。同一のキー値が複数ある場合は、まとめて削除されます。

fd.append('名前','意志');
fd.delete('名前');

フォーム内の名前情報とappend()で追加された名前情報はすべて削除されます。

get() と getAll()

検索するキーの名前を示すパラメータを受け取り、キーに対応する最初の値を返します。同一のキーが複数ある場合は、このキーに対応するすべての値を返す必要があります。

上記のフォームに基づいて:

fd.append('名前','意志');
console.log(fd.get('name')); // ショーン
fd.append('名前','意志');
console.log(fd.getAll('name')); // ["ショーン", "ウィル"]

もっている()

このメソッドは、キーの名前でもあるパラメータも受け取り、FormData オブジェクトにキーが含まれているかどうかを判断するために使用されるブール値を返します。上記のフォームを例に挙げます。

console.log(fd.has('name')); // 真
console.log(fd.has('Name')); // 偽

他のものは紹介しません。興味があれば、自分で検証してください。一度書いて、一度入力すれば、どんな記事を読むよりも実用的です!

上記の記事が役に立った場合は、私たちのオープンソース プロジェクトにスターを付けてください: github.crmeb.net/u/xingfu どうぞよろしくお願いいたします!

上記は、Vue で axios を使用して写真をアップロードする際に発生する問題の詳細です。Vue で axios を使用して写真をアップロードする方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue+SSMは画像アップロードのプレビュー効果を実現します
  • Vue+Element+Springboot画像アップロードの実装例
  • 写真をアップロードして顔を認識する Vue+axios サンプルコード
  • Vue.jsクラウドストレージで画像アップロード機能を実現
  • Vue ページ内の公開マルチタイプ添付画像アップロード領域と適用可能な折りたたみパネル (サンプルコード)

<<:  MySQL における大規模オブジェクトのマルチバージョン同時実行制御の詳細な説明

>>:  Dockerfile における ENV 命令の具体的な使用法の詳細な説明

推薦する

Webフォーム作成スキル

実際、上記の 3 つの表はいずれも 3 行 3 列です。区切り線を非表示にするコツはルールにあります...

MySQLとSpringの自動コミットの詳細な説明

1 MySQLの自動コミット設定MySQL はデフォルトで自動的にコミットします。つまり、各 DML...

よく知られているブラウザのDOCTYPEモード選択メカニズム

ドキュメントの範囲この記事では、Firefox やその他の Gecko ベースのブラウザ、Safar...

Centos6.5 の rpm パッケージから mysql5.7 をインストールするときに発生する初期化エラーの解決策

1. rzをサーバーにアップロードして解凍する rz [root@mini2 アップロード]# ta...

FirefoxのWeb開発者を使用してWebページのスタイルを無効にする方法

前提条件: Web開発者プラグインがインストールされている操作手順: [ツール] -> [We...

MySQLデータベースに中国語の文字を保存するときに発生するエラーを解決する方法を教えます

目次1. 遭遇した問題2. 問題を分析する3. 本当の問題4. 解決策5. ソリューション効果1. ...

NginxはURLのパスに応じてアップストリームに動的に転送します

Nginx では、URL のパス パラメータに基づいて、到達不可能なアップストリームに動的に転送する...

Linux statコマンドの使用

1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...

MySQL にテキストと画像を保存する方法

Oracle の大きなテキスト データ型 Clob 長いテキスト型 (MySQL ではサポートされて...

geo モジュールを使用して Nginx でホワイトリストを設定する例

元の構成: http { ...... limit_conn_zone $binary_remote...

js 正規表現の先読みと後読み、および非キャプチャグループ化

目次先読みと後読みをキャプチャグループと組み合わせる捕獲グループと非捕獲グループ前を向いて、後ろを振...

MySQLの認可コマンド grant の使い方のまとめ

MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...

Dockerを使用してコンテナリソースを制限する方法

覗き見の問題サーバーでは、IIS サービスが複数のサイトを展開していると仮定すると、サイトの 1 つ...

Vueの監視プロパティの詳細

目次1.watchは一般的なデータ(数値、文字列、ブール値)の変更を監視します。 1. 数値2. 文...

空のパスがページのパフォーマンスに与える影響に対する解決策

数日前、Google Reader で Yu Bo さんが共有した投稿「空のパスがページのパフォーマ...