Wie speichere ich ein Bild im Node Backend?

Sep 09 2020

Ich verwende Node und Express für das Backend und Mongo DB für die Speicherung. Ich verwende Multer Middleware zum Speichern von Bildern. Ich habe ein Problem und das Problem ist, wenn ich ein Bild vom lokalen Host speichere, wird es in meinem Backend gespeichert und auch in der Datenbank angezeigt , aber wenn ich die gleiche API auf Heroku oder einer anderen App bereitstelle, wird das Bild in der Datenbank angezeigt, aber nicht in meinem Backend gespeichert. Ich habe den Code auf Postman getestet. Was kann das Problem sein?

Unten ist mein Code auf Knoten js:

router.use(express.static(__dirname + 'public'));

let storage = multer.diskStorage({
destination: function (req, file, cb) {
    cb(null, 'public')
},
filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
}
})

let upload = multer({ storage: storage })
router.post('/fellows-details', upload.single('image'), async (req, res) => {

const { error } = FellowsDetails(req.body);
if (error) return res.status(400).send({ message: error.details[0].message });
const fellow = new fellowdetails({
    name: req.body.name,
    details: req.body.details,
    image: req.file.filename
})
try {
    fellow.save()
    res.status(200).send({ message: 'fellows detail saved successfully' })
} catch (err) {
    res.status(400).send(err);
}
})

Antworten

1 Arya Sep 15 2020 at 04:23

Nach dem Konvertieren in eine Zeichenfolge wird es einfach, Dateien zu speichern. Sie müssen lediglich eine Zeichenfolge in ein Bild in Ihrem Frontend konvertieren

Konvertieren Sie das Bild base64mit diesem Code in Ihrer API in einen String und vergessen Sie nicht, die Datei aus dem Upload-Ordner zu löschen

"img": new Buffer.from(fs.readFileSync(req.file.path)).toString("base64")

um die Datei zu löschen

           let resultHandler = function (err) {
                if (err) {
                    console.log("unlink failed", err);
                } else {
                    console.log("file deleted");
                }
            }

            fs.unlink(req.file.path, resultHandler);

auf Ihren Routen importieren multer

 `multer const multer = require('multer');
  const upload = multer({ dest: __dirname + '/uploads/images' });`

Fügen Sie upload.single('img')Ihre Anfrage hinzu

router.post('/fellows-details', authorize([Role.ADMIN, Role.USER]), 
            upload.single('img'), usersController.fellowsdetails);
PrathameshMore Sep 15 2020 at 04:09

Das Dateisystem auf Heroku ist nicht für die dauerhafte Speicherung von Daten geeignet. Das Heroku-Dateisystem ist kurzlebig - das bedeutet, dass Änderungen am Dateisystem, während der Prüfstand ausgeführt wird, nur so lange dauern, bis dieser Prüfstand heruntergefahren oder neu gestartet wird. Jeder Prüfstand wird mit einer sauberen Kopie des Dateisystems aus der letzten Bereitstellung gestartet. Sie können keine Dateien auf Heroku speichern. Heroku hat Ihre hochgeladenen Dateien automatisch entfernt. Sie müssen externe Dienste wie Amazon S3 oder Azure Blob Storage verwenden.

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-node-examples.html https://docs.microsoft.com/en-us/javascript/api/@azure/storage-blob/blockblobclient?view=azure-node-latest

Wenn Sie kein Konto bei AWS einrichten möchten, um einen S3-Bucket zu erstellen, finden Sie hier auch Add-Ons, die die Speicherung und Verarbeitung statischer Assets übernehmen https://elements.heroku.com/addons