2017-01-20 1 views
0

Hallo Ich bin ein abschließendes Projekt auf Heroku mit MongoLab und Multer zum Hochladen von Fotos scheint gut zu funktionieren, aber nach ein paar Stunden oder weniger die Fotos verschwinden von der Seite, aber die img Platzhalter und ein anderes Feld wie Name oder Datum, wo es war.Verwenden von Knoten, Express und Multer zum Hochladen einer Datei in MongoDB? Was soll ich benutzen, Multer oder GRIDfs?

Ist das Heroku oder Mongolab Problem oder ist es nur das kostenlose Konto ist dies wegen der kostenlosen acounts. es spielt auch keine Rolle, ob ein Foto hochgeladen wird oder ein Dutzend, die nach einer Weile verschwinden werden.

Können Sie mir helfen? Gibt es einen Hack, eine trickreiche Codezeile oder etwas, das ich falsch mit Multer oder meiner Datenbank gemacht habe? Ich habe eine gründliche Recherche im Internet gemacht und Stack-Overflow fand ich etwas GRIDfs nennen, aber ich weiß nicht, ob das funktionieren wird. Kannst du mir sagen, ob ich richtig liege?

Dies ist mein Code für Multer:

var express  = require("express"), 
    body_parser = require("body-parser"), 
    multer   = require("multer"), 
    mongoose  = require("mongoose"); 

    var app = express(); 

    //connect my local database to MongoLab database 

    var url = process.env.DATABASE || "mongodb://localhost/black_hat"; 

    mongoose.connect(url); 

Multer Konfiguration

var storage = multer.diskStorage({ 
destination: function(req, file, callback){ 
    callback(null, "./public/uploads"); 
}, 
filename: function(req, file, callback){ 
    callback(null, Date.now() + file.originalname); 
} 
    }); 

var upload = multer({storage : storage}).single("image"); 

Meine POST Route

app.post("/fotos_videos", isLoggedIn, function(req, res) { 
    upload(req, res, function(err) { 
     if(err){ 
      return res.end("Error uploading file"); 
     } 
     // get data from form 
     var newName = req.body.name, 
      newCover = "/uploads/" + req.file.filename; 
     // Packing into an object 
     var newCollage = { 
      name : newName, 
      cover: newCover 
     }; 
     //create new album 
     Collage.create(newCollage, function(err, collage) { 
      if(err){ 
       console.log(err); 
      } else { 
       // console.log(collage); 
       res.redirect("/fotos_videos"); 
      } 
     }); 
    }); 
}); 

Das Formular, wo ich das Bild hochladen

<div style="width=30%; margin: 30px auto" > 
 
     
 
     <form action="/fotos_videos" method="POST" enctype="multipart/form-data"> 
 
      <div class="form-group"> 
 
       <label>Album Name</label> 
 
       <input type="text" name="name" placeholder="Album Name" class="form-control"> 
 
      </div> 
 
      <div class="form-group"> 
 
       <label>Choose Album Cover</label> 
 
       <input type="file" name="image" placeholder="image url" class="form-control" required> 
 
      </div> 
 
      
 
      <div class="form-group"> 
 
       <button class="btn btn-lg btn-primary btn-block">Upload</button> 
 
      </div> 
 
     </form> 
 
     
 
     <a href="/fotos_videos">Back</a> 
 
     
 
    </div>

Schließlich mein Modell für Collage

var mongoose = require("mongoose"); 

// Schema 
var collageSchema = new mongoose.Schema({ 
    name : String, 
    cover : String, 
    photos: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Photo" 
    }] 
}); 

var Collage = mongoose.model("Collage", collageSchema); 

module.exports = Collage; 

Jede Art von Hilfe wird geschätzt.

Antwort

0

Ich weiß nicht, ob dies hilfreich sein wird. aber aus meinem Verständnis ist Multer das Zeug, um die Daten vom Benutzer zu bekommen (wie hochgeladene Bilder). Es macht keinen dauerhaften Speicher. Wenn Sie die Daten (große Dateien wie Bilder) speichern möchten, sollten Sie gridfs-stream verwenden.

Sie sollten einen Lese-Stream zu GridFs erstellen, sobald die Daten vom Benutzer eintreffen.

+0

danke für den Kommentar @jackblack genau ich will dauerhaften Speicher. Ich habe den gridfs-stream gefunden, aber könntest du mir ein Beispiel zeigen? Du hast mein Problem verstanden !! Ich möchte erreichen, dass ein Benutzer ein Foto und eine Beschreibung zu diesem Foto hochlädt und mir dann diese Information (das Bild und die Beschreibung) im Webbrowser anzeigt, dann möchte der Benutzer vielleicht das Foto bearbeiten oder löschen. Wie bei einer CRUD-Anwendung habe ich diese Funktionalität mit Mungo und Multer erreicht, aber wie Sie sehen können, funktioniert dies nicht, um Daten persistent zu machen. Jede Hilfe ist willkommen –

+0

@CarlosMoreno Sie können Gridfs-Stream verwenden und Sie können Bild hochladen und herunterladen, wie Sie mit normalen Dateiupload mit Multer tun. Was ist besser Ich bin immer noch verwirrt Ich finde diese Antwort auch :) –

Verwandte Themen