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

So erstellen Sie schnell MySQL Master-Slave mit mysqlreplicate

Einführung Das mysql-utilities-Toolset ist eine S...

So ändern Sie das Root-Passwort in MySQL 5.7

Ab MySQL 5.7 wurden viele Sicherheitsupdates hinz...

Häufig verwendete JS-Funktionsmethoden im Frontend

Inhaltsverzeichnis 1. E-Mail 2. Mobiltelefonnumme...

Auszeichnungssprache - für

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

So zeichnen Sie in CocosCreator ein cooles Radardiagramm

Inhaltsverzeichnis Vorwort Vorschau Text Grafikko...

border-radius ist eine Methode zum Hinzufügen abgerundeter Ränder zu Elementen

border-radius:10px; /* Alle Ecken sind mit einem ...

Erfahrungsaustausch zur MySQL-Slave-Wartung

Vorwort: Die MySQL-Master-Slave-Architektur dürft...

SQL GROUP BY ausführliche Erklärung und einfaches Beispiel

Die GROUP BY-Anweisung wird in Verbindung mit der...

Einführung in die Containerfunktion of() in der Linux-Kernel-Programmierung

Vorwort Bei der Linux-Kernel-Programmierung werde...

Allgemeine Befehle zum Bereitstellen von InfluxDB und Mongo mit Docker

Bereitstellen einer Datenbank basierend auf Docke...

So ändern Sie die Farbe der gesamten Zeile (tr), wenn die Maus in HTML stoppt

Verwenden Sie reines CSS, um die Hintergrundfarbe...