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をシンプルに学ぶ

推薦する

新しいカーネルをLinuxシステムに移植する手順

1. ubuntu16.04 イメージと対応する ubuntu16.04 カーネル バージョンのソー...

Centos7 への MySQL8 のインストールチュートリアル

MySQL 8 の新機能: MySQL をバージョン 5.x から 8.x に直接アップグレードする...

202 無料の高品質 XHTML テンプレート (1)

ここで 123WORDPRESS.COM はこれらのテンプレートの最初の部分を紹介します。各テンプレ...

デュアル VIP を使用した高可用性 MySQL クラスタの構築

目次1. プロジェクトの説明: 2. プロジェクト環境: 2. プロジェクトの手順: 3. プロジェ...

MySQL ビューの原則分析

目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...

WebStormはVue3統合APIのソリューションを正しく識別できません

1 問題の説明Vue3 の統合 API は、defineComponent やその他の関数が認識でき...

js を使用して XML オンライン エディターを作成する例

目次序文オンラインXMLエディタの必要性テクノロジー事前調査ビジュアルプログラミングVSCODEプラ...

Linux で大きなファイルの指定された内容を見つける方法

大きなことも小さなことも考えて、方向転換しましょう。 Linux では非常に大きなファイルに遭遇する...

ウェブサイトメンテナンスページのリスト構築のヒント

また、多くの場合、メンテナンスのために Web サイトを少なくとも数分間オフラインにする必要がありま...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

nginx rewriteを使用してURLをリダイレクトする方法

最近仕事でnginxの設定を変更する必要が頻繁にあり、nginxでrewriteを使用する方法を学び...

Ubuntu 14.04 で QT5 をインストール、設定、アンインストールするための詳細な手順

1. 以前 QT5.13 バージョンをダウンロードしましたが、インストール後、Qtcreator を...

calc() で全画面背景の固定幅コンテンツを実現

ここ数年、Web デザインには「全幅背景と固定幅コンテンツ」というトレンドが生まれています。このデザ...

アイデアを war パッケージにパッケージ化し、tomcat にデプロイしてアクセス パスの問題 (図とテキスト)

Web プロジェクトを war にパッケージ化するアイデアにとって最も重要なことは、アトリフィカを...

JS クロスドメイン ソリューション React 構成 リバース プロキシ

クロスドメインソリューションjsonp (get をシミュレート) CORS (クロスオリジンリソー...