So handhaben Sie Bilder in Vue-Formularen

So handhaben Sie Bilder in Vue-Formularen

Frage:

Ich habe in Vue ein Formular zum Hochladen von Blogbeiträgen. Es bietet Bereiche für Titel, Text, Beschreibung, Snippet und Bild. Alles ist notwendig. Ich habe in Express eine API eingerichtet, um dies zu handhaben. Ich habe es in Postman getestet und es hat gut funktioniert, aber ich weiß nicht, wie ich die Datei über den Browser an die Datenbank senden kann. Ich erhalte ständig einen 500-Fehler und drucke die Daten auf der Konsole aus. Das Bildfeld ist leer. Ich bin also sicher, dass das das Problem ist, kann aber einfach nicht herausfinden, was es ist.

Dies ist die Form meiner Front-End-Seite:

<Vorlage>
 <div Klasse="Container">
  <div id="nav">
   <Administratornavigation/>
  </div>
  <div id="erstellen">
   <h1>Neuen Beitrag erstellen</h1>
  </div>
  <div id="Beitrag">
   <Text>
    <form>
     <label for="title">Titel: </label>
     <textarea v-model=formdata.title Zeilen="5" Spalten="60" Name="Titel"
      Platzhalter="Text eingeben">
     </textarea>
     <br/>
     <label for="body">Textkörper: </label>
     <textarea v-model=formdata.body Zeilen="5" Spalten="60" Name="body"
      Platzhalter="Text eingeben">
     </textarea>
     <br/>
     <label for="description">Beschreibung: </label>
     <textarea v-model=formdata.description Zeilen="5" Spalten="60" Name="Beschreibung"
      Platzhalter="Text eingeben">
     </textarea>
     <br/>
     <label for="snippet">Ausschnitt: </label>
     <textarea v-model=formdata.snippet Zeilen="5" Spalten="60" Name="snippet"
      Platzhalter="Text eingeben">
     </textarea>
     <br/>
     <label for="file">Foto hochladen: </label>
     <Eingabe
      Klasse="Formular-Steuerdatei"
      Typ="Datei"
      akzeptieren="image/*"
      v-bind="formdata.photo"
     />
     <br/>
     <input id="senden" type="senden" value="senden" @click.prevent="createPost()"/>
    </form>
   </body>
  </div>
 </div>
</Vorlage>

<Skript>
importiere Adminnav aus „../components/adminnav.vue“;
importiere PostService aus „../service/PostService“;

Standard exportieren {
 Name: "createStory",
 Komponenten:
  Administratornavigation,
 },
 Daten() {
  zurückkehren {
   Formdaten: {
    Titel: '',
    Körper: '',
    Beschreibung: '',
    Ausschnitt: '',
    Foto: null,
   },
  };
 },
 Methoden: {
  Beitrag erstellen() {
   Konsole.log(diese.Formdaten);
   /* eslint bevorzugt Destrukturierung: 0 */
   const formdata = diese.formdata;
   PostService.createPost(Formulardaten)
    .then(() => {
     console.log('Erfolg');
    });
  },
 },
};
</Skript>

Dies ist eine POST-Anfrage.

router.post("/add-story", upload.single('Foto'), async(req, res) => {
 versuchen{
  let post = neuer Beitrag();
  Beitragstitel = erforderlicher Textkörpertitel;
  Beitragsbeschreibung = erforderliche Textkörperbeschreibung;
  post.photo = erforderlicher.Dateispeicherort;
  post.body = erforderlich.body.body;
  Beitrag.Snippet = erforderlich.Body.Snippet;

  warte auf post.save();

  res.json({
   Status: wahr,
   Meldung: „Erfolgreich gespeichert.“
  });

 } Fang(Fehler) {
  res.status(500).json({
   Erfolg: falsch,
   Nachricht: Fehlernachricht
  });
 }
});

Problemumgehung

Lassen Sie uns das change der Datei <input> überwachen. Dadurch wird sichergestellt, dass jedes Upload-Verhalten des Benutzers updatePhoto auslöst und die Dateidaten in this.photo speichert.

<Eingabetyp="Datei" akzeptieren="Bild/*" Klasse="Formular-Steuerungsdatei"
  @change="updatePhoto($event.target.name, $event.target.files)"
>

Code zum Sammeln aller Daten und Senden der Anfrage

// Der Rest der Vue-Komponente data () {
  zurückkehren {
    Titel: '',
    Körper: '',
    Beschreibung: '',
    Ausschnitt: '',
    Foto: {} //Dateidaten speichern};
},
Methoden: {
  updatePhoto (Dateien) {
    wenn (!Dateien.Länge) return;

    //Dateidaten speichern this.photo = {
      Name: Dateien[0].Name,
      Daten: Dateien[0]
    };
  },
  Beitrag erstellen() {
    let formData = neue FormData();

    formData.append('Titel', dieser.Titel);
    formData.append('body', dieser.body);
    formData.append('Beschreibung', diese.Beschreibung);
    formData.append('snippet', dieses.snippet);
    formData.append('Foto', dieses.Foto.Daten, dieser.Foto.Name);

    PostService.createPost(Formulardaten)
    .then(() => {
      console.log('Erfolg');
    });
  }
}
// Der Rest der Vue-Komponente

Offensichtlich habe ich viele Dinge übersprungen, wie die gesamte Vue-Komponentenstruktur, die für diese Frage sicher irrelevant ist, und einige Prüfungen, um sicherzustellen, dass die Dateidaten verfügbar sind, bevor die Anfrage usw. gestartet wird. Dies ist eine Idee, wie Sie an die Dateidaten gelangen. Hoffentlich kann diese Antwort Sie inspirieren.

Oben finden Sie Einzelheiten zur Verarbeitung von Bildern in Vue-Formularen. Weitere Informationen zur Verarbeitung von Bildern in Vue-Formularen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Vue+elementUI implementiert ein Beispiel für eine Formular- und Bild-Upload- und Überprüfungsfunktion
  • Beispiel für die Übermittlung eines Vue Axios-Formulars zum Hochladen von Bildern
  • Verwenden Sie Vue, um ein Formular zum Hochladen von Bildern zu erstellen

<<:  Was tun, wenn Sie das ursprüngliche Passwort für MySQL auf dem MAC vergessen?

>>:  Lernen Sie MySQL auf einfache Weise

Artikel empfehlen

Die einfachste Formularimplementierung des Flexbox-Layouts

Flexibles Layout (Flexbox) erfreut sich zunehmend...

Vue-Praxis zur Vermeidung mehrfacher Klicks

Im Allgemeinen werden Klickereignisse in verschie...

Vue implementiert Card-Flip-Karussellanzeige

Karussellanzeige der Vue-Karte beim Umschalten de...

jQuery ermöglicht nahtloses Scrollen von Tabellen

In diesem Artikelbeispiel wird der spezifische Co...

Implementierung von MySQL Multi-version Concurrency Control MVCC

Inhaltsverzeichnis Was ist MVCC MVCC-Implementier...

So importieren Sie SQL-Dateien in Navicat Premium

Ich habe heute mit der Arbeit an meinem Abschluss...

Inaktive Benutzer nach einem Login-Timeout in Linux automatisch abmelden

Methode 1: Ändern Sie die Datei .bashrc oder .bas...

Wann ist die Verwendung von dl, dt und dd sinnvoll?

dl: Definitionsliste Definitionsliste dt: Definiti...

Detaillierte Erläuterung der Vue Simple Notepad-Entwicklung

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der grundlegenden Wissenspunkte der Linux-Gruppe

1. Grundlegende Einführung in die Linux-Gruppe Un...

Verwendung von Vue3-Seiten, Menüs und Routen

Inhaltsverzeichnis 1. Klicken Sie auf das Menü, u...