React: Wie kann ich ein Bild in den Application-Ordner /public/profile-pictures hochladen?

regex9  22.09.2022, 11:06
  1. Womit schreibst du deine Serveranwendung? Auch JavaScript oder mit einer anderen Programmiersprache (PHP / Ruby / ...)?
  2. Verwendest du für deine Serveranwendung bestimmte Frameworks?
Reconnact420 
Fragesteller
 22.09.2022, 12:15

ich benutze nur JavaScript, auch in der serveranwendung, welche eigentlich nur eine Sammlung an axios Requests ist.

2 Antworten

Zum Empfangen der Daten würde ich auf das formidable-Modul zurückgreifen. Außerdem benötigst du das fs-Modul zum Schreiben der Daten in das Dateisystem. Installiere dir die Module via NPM und binde sie ein:

const formidable = require("formidable");
const fs = require("fs");

Im Anschluss kannst du in deinem POST-Handler für den Upload die Datenverarbeitung formulieren.

const form = new formidable.IncomingForm();
form.parse(request, (error, fields, file) => {
  const filepath = file.fileupload.filepath;
  const filename = file.fileupload.originalFilename;
  // validate and filter filename ...
  const destinationPath = `${__basedir}/public/profile-pictures/${filename}`;
  
  fs.rename(filepath, destinationPath, () => {
    // some success message (?)
    response.end();
  });
});

Die Variabe __basedir wird in der app.js definiert.

global.__basedir = __dirname;

Das ist soweit ein Upload ohne Filter. Zumindest für das Produktivsystem solltest du allerdings eine Filterung einbauen, die beispielsweise die Dateigröße und den MIME-Typ beschränkt.

Für deinen Client bräuchtest du nun noch ein Formular mit Upload-Feld. Auf GeeksForGeeks findest du eine Beispielimplementation, die auch Axios nutzt.

Beachte, dass input-Elemente keine Kindelemente aufnehmen können und daher auch keinen extra schließenden Tag haben.

Du musst die Datei mit der POST Methode zum Beispiel an dein Backend senden. Dies kannst du mit <form> machen oder mit Ajax

Reconnact420 
Fragesteller
 22.09.2022, 10:38

Klar, aber ich bekomms nicht hin, die Datei nachher zu speichern.

0