2017-05-05 11 views
5

Próbuję przechwycić tekstowy ciąg (oparty na klientach/sesjach), gdy użytkownik przesyła obraz.Przechwytuj ciąg i przechowuj go w mongoDB

Wyjście robiąc db.collection.find(); z konsoli teraz podczas przesyłania:

"_id" : ObjectId("590c67f472667e031fe80a9d"), "path" : "uploads/bicycle.jpg", "originalname" : "bicycle.jpg", "__v" : 0

Tutaj chcę mieć "imagelocation" : "N/A" również.

Łańcuch bazuje na lokalizacji użytkownika podczas przesyłania obrazu. Chcę połączyć tę określoną wartość łańcuchów z identyfikatorem obiektów obrazu, jak pokazano powyżej.

App.js:

/image UPLOAD TO MONGODB 

var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var path = require('path'); 
app.use(bodyParser.json()); 

//To get the access for the functions defined in imagefile.js class 
var routes = require('./imagefile'); 

// connect to mongo, 
mongoose.connect('mongodb://localhost:27017/gps'); 

app.use('/', routes); 

// To get all the images/files stored in MongoDB 
app.get('/images', function(req, res) { 
    routes.getImages(function(err, genres) { 
     if (err) { 
     throw err; 
     } 
res.json(genres); 

}); 
}); 

app.get('/images/:id', function(req, res) { 
    routes.getImageById(req.params.id, function(err, genres) { 
    if (err) { 
     throw err; 
    } 

res.send(genres.path) 
}); 
}); 

ścieżka i ORIGINALNAME deklarowane są w następujący sposób: w moich imagefile.js

var imageSchema = mongoose.Schema({ 
path: { 
    type: String, 
    required: true, 
    trim: true 
}, 
originalname: { 
    type: String, 
    required: true 
}, 
imagelocation:{ // format for storing 
    type: String, 
    required: true 
} 

}); 
module.exports = mongoose.model('Image', stringClass); 
var Image = module.exports = mongoose.model('files', stringClass); 

router.getImages = function(callback, limit) { 

Image.find(callback).limit(limit); 
} 


router.getImageById = function(id, callback) { 

Image.findById(id, callback); 

} 

router.addImage = function(image, callback) { 
Image.create(image, callback); 
} 
//multer 
var storage = multer.diskStorage({ 
destination: function(req, file, cb) { 
cb(null, 'uploads/') 
}, 
filename: function(req, file, cb) { 
cb(null, file.originalname); 
}, 
imagelocation: function(req,file,cb){ 
    cb(null, $('#coordinates').innerHTML); 
} 
}); 

var upload = multer({ 
storage: storage 
}); 

router.get('/', function(req, res, next) { 
res.render('layouts/main.handlebars'); 
}); 

router.post('/', upload.any(), function(req, res, next) { 

res.send(req.files); 

var path = req.files[0].path; 
var imageName = req.files[0].originalname; 
var imagepath = {}; 
imagepath['path'] = path; 
imagepath['originalname'] = imageName; 


router.addImage(imagepath, function(err) { 

}); 

}); 

module.exports = router; 

HTML:

<p id="coordinates">String is generated here</p> 

TL; DR - w jaki sposób mogę przechwycić ciąg i wysłać go wraz z obrazem podczas przesyłania go do mojego MongoDB?

całego projektu można znaleźć na stronie: https://github.com/joelfolkesson/myapp

plików w celu sprawdzenia:

  • imagefile.js

  • app.js // (wiersz 204 ->)

Odpowiedz

0

Aby wysłać ciąg znaków długi z plikiem obrazu, wystarczy wysłać go wraz z formularzem o n złożenia. Na przykład w ukrytym polu wprowadzania.

Wtedy, o poddaniu, można uzyskać do niego dostęp w ramach req.body obiektu

Oto przykład (z API, ale masz pomysł):

app.post('/api/file', function(req, res){ 
    var upload = multer({ 
     storage: storage 
    }).single('imageFile') 
    upload(req, res, function(err){ 
     if(err){ 
      // handle any errors here ... 
     } 
     console.log(req.body)// <-- here you can access your text string as 'req.body.yourStringIdentifier' 
     res.json({success: true, msg: 'File uploaded'}); 
    }) 
}) 

Jeśli masz jakieś pytania krępuj się zapytać :)


Edycja: Pełne przykład

server.js:

const express = require('express'); 
const multer = require('multer'); 
const path = require('path'); 
const ejs = require('ejs'); 
var app = express(); 
app.set('view engine','ejs'); 

app.get('/', function(req, res){ 
    res.render('index'); 
}) 

var storage = multer.diskStorage({ 
    destination: function(req, file, callback){ 
     callback(null, './uploads'); 
    }, 
    filename: function(req, file, callback){ 
     callback(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)); 
    } 
}) 

app.post('/', function(req, res){ 
    var upload = multer({ 
     storage: storage 
    }).single('imageFile') 
    upload(req, res, function(err){ 
     console.log(req.body.textInput); 
     res.end('File is uploaded'); 
    }) 
}) 

var port = process.env.PORT || 7850 
app.listen(port, function(){ 
    console.log('Listening on port ' + port); 
}) 

index.ejs:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="UTF-8"> 
     <title>INDEX</title> 
    </head> 
    <body> 
     <form id="uploadForm" enctype="multipart/form-data" method="post"> 
      <input type="file" name="imageFile"> 
      <input type="text" name="textInput"> 
      <input type="submit" value="Upload file" name="submit"> 
     </form> 
    </body> 
</html> 

ten kod działa, gdy uruchomię go z terminalu z nodemon server.js. Po przesłaniu formularza zawartość pola tekstowego zostanie wydrukowana na konsoli.

+0

Hmm, tak, to był pomysł na początku, jednak "nieokreślony" jest zwracany za każdym razem, gdy próbujemy zarejestrować odpowiedź. Czy możesz spróbować zaimplementować to, co napisałeś, w bardziej wyczerpującej odpowiedzi? Dzięki! – Joel

+0

Zobacz zaktualizowaną odpowiedź :) –

+0

Próbowałem już od godziny, aby Twoje rozwiązanie działało, ale po prostu nie mogę. :/Nie widzę, jak by to przechowywał ciąg w tym samym obiekcie db. – Joel

0

Joel, Zgodnie z dokumentacją Multer The var storage = multer.diskStorage({.....}) silnik Disk Storage daje pełną kontrolę na przechowywanie plików na dysku i ma tylko dwie opcje dostępne, miejsce docelowe i nazwę pliku. Oba funkcje określają, gdzie plik powinien być przechowywany.

  • Destination służy do określenia, w którym folder przesłane pliki powinny być przechowywane
  • Nazwa pliku jest używana do określenia, jaki plik powinien być nazwany wewnątrz folderu.

W ten sposób sposób definiowania multer.diskStorage jest niepoprawny.

Jeśli próbujesz przesłać go do MongoDB odnoszą się następujące łącze: https://ciphertrick.com/2017/02/28/file-upload-with-nodejs-and-gridfs-mongodb/

Jeśli chcesz zapisać plik w pamięci dyskowej, a następnie przesłać informacje o pliku, które są przechowywane przy użyciu schematu

var imageSchema = mongoose.Schema({ 
    path: { 
      type: String, 
      required: true, 
      trim: true 
     }, 
    originalname: { 
      type: String, 
      required: true 
     }, 
    imagelocation:{ // format for storing 
      type: String, 
      required: true 
     } 

     }); 

następnie dokonać zmian w

var imagepath = {}; 
imagepath['path'] = path; 
imagepath['originalname'] = imageName; 
    /* provide logic here as mentioned by David Stenstrøm to read it 
    from request.body and move it to the image schema object 

router.addImage(imagepath, function(err) { 

}); 

nadzieję, że wyjaśnione zapytanie :) :)

Powiązane problemy