Vueフォームで画像を処理する方法

Vueフォームで画像を処理する方法

質問:

Vue にブログ投稿をアップロードするためのフォームがあり、タイトル、本文、説明、スニペット、画像のスコープがあります。すべて必要です。これを処理するために Express で API を設定しました。 Postman でテストしたところ、問題なく動作しましたが、ブラウザ経由でファイルをデータベースに送信する方法がわかりません。 500 エラーが繰り返し発生し、データをコンソールに出力しても画像フィールドが空なので、それが問題であることは間違いないのですが、何が問題なのかがわかりません。

これは私のフロントエンドページの形式です:

<テンプレート>
 <div class="コンテナ">
  <div id="nav">
   <adminnav/>
  </div>
  <div id="作成">
   <h1>新しい投稿を作成</h1>
  </div>
  <div id="post">
   <本文>
    <フォーム>
     <label for="title">タイトル: </label>
     <textarea v-model=formdata.title 行数="5" 列数="60" 名前="タイトル"
      placeholder="テキストを入力">
     </テキストエリア>
     <br/>
     <label for="body">本文: </label>
     <textarea v-model=formdata.body 行数="5" 列数="60" 名前="本文"
      placeholder="テキストを入力">
     </テキストエリア>
     <br/>
     <label for="description">説明: </label>
     <textarea v-model=formdata.description 行数="5" 列数="60" 名前="説明"
      placeholder="テキストを入力">
     </テキストエリア>
     <br/>
     <label for="snippet">スニペット: </label>
     <textarea v-model=formdata.snippet 行数="5" 列数="60" 名前="スニペット"
      placeholder="テキストを入力">
     </テキストエリア>
     <br/>
     <label for="file">写真をアップロード: </label>
     <入力
      class="フォームコントロールファイル"
      タイプ="ファイル"
      accept="画像/*"
      v-bind="formdata.photo"
     />
     <br/>
     <input id="submit" type="submit" value="submit" @click.prevent="createPost()"/>
    </フォーム>
   </本文>
  </div>
 </div>
</テンプレート>

<スクリプト>
'../components/adminnav.vue' から adminnav をインポートします。
'../service/PostService' から PostService をインポートします。

エクスポートデフォルト{
 名前: 'createStory',
 コンポーネント:
  管理者ナビ、
 },
 データ() {
  戻る {
   フォームデータ: {
    タイトル: ''、
    体: ''、
    説明: ''、
    スニペット: ''、
    写真: null、
   },
  };
 },
 メソッド: {
  ポストを作成します(){
   console.log(this.formdata);
   /* eslint 優先分割: 0 */
   フォームデータ = this.formdata;
   PostService.createPost(フォームデータ)
    .then(() => {
     console.log('成功');
    });
  },
 },
};
</スクリプト>

これは POST リクエストです。

router.post("/add-story", upload.single('photo'), async(req, res) => {
 試す{
  post = new Post();
  post.title = req.body.title;
  post.description = req.body.description;
  post.photo = 必要なファイルの場所;
  post.body = req.body.body;
  post.snippet = req.body.snippet;

  post.save() を待機します。

  res.json({
   ステータス: true、
   メッセージ: 「正常に保存されました。」
  });

 } キャッチ(エラー) {
  res.status(500).json({
   成功: false、
   メッセージ: エラーメッセージ
  });
 }
});

回避策

ファイル<input>changeイベントを監視してみましょう。これにより、各ユーザーのアップロード動作によってupdatePhotoメソッドがトリガーされ、ファイル データがthis.photoに保存されるようになります。

<input type="file" accept="image/*" class="form-control-file"
  @change="写真を更新($event.target.name、$event.target.files)"
>

すべてのデータを収集してリクエストを送信するコード

// 残りのvueコンポーネントデータ(){
  戻る {
    タイトル: ''、
    体: ''、
    説明: ''、
    スニペット: ''、
    photo: {} // ファイルデータを保存します};
},
メソッド: {
  updatePhoto (ファイル) {
    if (!files.length) が返されます;

    //ファイルデータを保存する this.photo = {
      名前: ファイル[0].名前、
      データ: ファイル[0]
    };
  },
  ポストを作成します(){
    formData を新しい FormData() にします。

    formData.append('title', this.title);
    フォームデータを追加します。
    formData.append('description', this.description);
    formData.append('スニペット', this.snippet);
    formData.append('photo', this.photo.data, this.photo.name);

    PostService.createPost(フォームデータ)
    .then(() => {
      console.log('成功');
    });
  }
}
// Vueコンポーネントの残り

明らかに、この質問とは無関係であると確信している vue コンポーネント構造全体や、リクエストを開始する前にファイル データが利用可能であることを確認するためのいくつかのチェックなど、多くのことを省略しました。これはファイル データを取得する方法についてのアイデアなので、この回答が参考になれば幸いです。

以上がVueフォームで画像を処理する方法の詳細です。Vueフォームで画像を処理する方法の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue+elementUI はフォームと画像のアップロードおよび検証機能の例を実装します
  • 写真をアップロードするための Vue axios フォーム送信例
  • vue を使用して画像アップロードフォームを構築する

<<:  高同時実行シナリオにおける nginx 最適化の詳細な説明

>>:  MySQLをシンプルに学ぶ

推薦する

CSSレイアウトで中央揃えレイアウトを実現する方法

1. 親コンテナーをテーブルに設定し、子をインライン要素に設定します。テキストを表示するサブコンテン...

WeChatアプレットでグローバル変数を監視する方法

最近、仕事で問題に遭遇しました。グローバル変数 red_heart があります。これは多くの場所で使...

ウェブサイトにダークモード切り替え機能を持たせるための純粋なCSSフリー実装コード

序文ダーク モードの概念は、 MacOS系統のMojaveに由来し、ユーザーが選択できる 2 つのス...

MySQL の中国語ソートの詳細と例

MySQL の漢字ソートの詳細な説明デフォルトでは、MySQL は日付、時刻、および英語の文字列の並...

Vueのprovideとinjectの使い方と原則を分析する

まず、provide/inject を使用する理由について説明しましょう。祖父コンポーネントと孫コン...

Docker に ElasticSearch 6.x をインストールする詳細なチュートリアル

まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...

VUE+SpringBootはページング機能を実装します

この記事では主に、Vue + SpringBoot でページ分割されたリストデータを実装する方法を紹...

Dockerを使用してNextCloudネットワークディスクを展開する方法

NextCloud コンピュータ上の任意のファイルやフォルダを共有し、NextCloud サーバーと...

MySQL の全体的なアーキテクチャの紹介

MySQL の全体的なアーキテクチャは、サーバー層とストレージ エンジン層に分かれています。サーバー...

ベースタグとは何ですか? また、それは何をするのですか?

<base> タグは、ページ上のすべてのリンクのデフォルトのアドレスまたはデフォルトの...

1つのSQL文でMySQLの重複排除が完了し、1つが保持されます。

数日前、ある要件に取り組んでいたとき、MySQL で重複レコードをクリーンアップする必要がありました...

Linux CentOS 7.7 システムの VMware インストールに関する詳細なチュートリアル

Linux CentOS 7.7 システムを Vmware にインストールする方法。最小限のインスト...

タブバーの切り替え効果を実現するJavaScript

タブバー: 異なるタブをクリックすると異なるコンテンツが表示され、クリックしたタブのスタイルが変更さ...

さようなら Docker: 5 分で Containerd に移行する方法

Docker は非常に人気のあるコンテナ技術です。K8S によって廃止され、別のコンテナ技術である ...

角度に基づくツリー型セカンダリテーブルを実現する

まず効果を見てみましょう: コード: 1.html <div class="user...