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

Beispielcode zur Implementierung der Alipay-Sandbox-Zahlung mit Vue+SpringBoot

Laden Sie zunächst eine Reihe von Dingen aus der ...

Detaillierte Erläuterung des Vue-Routing-Routers

Inhaltsverzeichnis Routing-Plugins modular nutzen...

Der Unterschied zwischen useEffect und useLayoutEffect in React

Inhaltsverzeichnis Voraussetzungen Effekt verwend...

Docker-Fallanalyse: Erstellen eines MySQL-Datenbankdienstes

Inhaltsverzeichnis 1 Konfigurations- und Datenver...

So erstellen Sie ein php-nginx-alpine-Image von Grund auf in Docker

Obwohl ich bereits einige Projekte in einer Docke...

Detailliertes Tutorial zur Installation und Bereitstellung von Nginx Linux

1. Einführung in Nginx Nginx ist ein Webserver, d...

Eine sehr detaillierte Erklärung des Linux DHCP-Dienstes

Inhaltsverzeichnis 1. DHCP-Dienst (Dynamic Host C...

So leiten Sie über den Nginx-Lastausgleich zu https um

Kopieren Sie das Zertifikat und den Schlüssel im ...