Я хочу загрузить объект, содержащий изображение, в базу данных mongodb с помощью nodejs, но я не могу этого сделать.
Угловой файл
onSelectedFile(event){
this.edit_image = event.target.files[0];
}
editProfile(e){
const user = {
email:this.edit_email,
img:this.edit_image,
}
console.info("To Update");
console.info(user);
this._authService.editProfile(user)
.subscribe(data=>{
this.dataFromService=data;
this.user=this.dataFromService.user;
console.info(data);
})
}
В служебном файле
editProfile(user){
let headers = new HttpHeaders();
headers=headers.append('content-type','application/json');
console.info("Updating Profile");
console.info(user);
return this.http.post('http://localhost:8080/profile/edit_Profile',user,{headers:headers})
.pipe(catchError(this.errorHandler))
}
В файле Nodejs
router.post('/edit_profile', (req, res) => {
let updateProfile = {
email: req.body.email,
img: req.body.img
};
console.info("Profile");
console.info(updateProfile); //to check the data
console.info("Profile");
Profile.updateP(updateProfile, (err, user) => {
if (err) throw err;
else {
console.info("Update User");
console.info(user);
res.json({
user: user
})
}
})
})
При регистрации данных в profileUpdate печатается пустое значение img
Схема пользователя
const profileSchema = schema({
email: {
type: String,
},
img: { data: Buffer, contentType: String }
});
Я хочу обновить существующий профиль, но я не могу использовать multer или даже передавать данные изображения из файла angular в файл nodejs.
См. также Загрузка файла в Angular? и МУЛЬТЕР README, которые действительно весьма информативны. Обратите внимание, что открытый Информация о файле из multer на самом деле имеет свойство buffer
, которое предоставляет Buffer
полное двоичное содержимое файла/изображения.
Вместо того, чтобы загружать изображение в базу данных, используйте что-то вроде s3 для хранения изображения и загрузки ссылки на это изображение в mongodb.
Но как я могу использовать multer?
настроить multer как промежуточное ПО. См. документацию multer. Сохраните изображение в локальной файловой системе, затем используйте службу хранения изображений, загрузите изображение, затем сохраните ссылку в mongodb.
Вы можете преобразовать свое изображение в формат base64, который очень легко обрабатывать и хранить в базе данных. функция для преобразования изображения в base64: -
var fs = require('fs');
function base64_encode(){
var imageAsBase64 = fs.readFileSync('test.png', 'base64');
// code to store it in the mongodb here
}
функция для преобразования base64 в изображение: -
var fs = require('fs');
function base64_decode(){
var imageAsBase64 //some base64 encoded string
var data = imageAsBase64..replace(/^data:image/png;base64,/, "")
fs.writeFile("out.png", data, 'base64', function(err) {
console.info(err);
});
}
Вы не сможете отправить «данные изображения» в теле JSON без предварительного кодирования. То, что вы, вероятно, действительно хотите сделать, это использовать на самом деле
multipart/form-data
(от чего на самом деле «multer» получил свое название) для отправки с запросом вместо этого. Multer может принять это как двоичный контент, который также соответствует типуBuffer
в схеме мангуста и хранится как BSONBinary
на самом деле в MongoDB. Также есть тип Mime с составными границами, который также можно извлечь из мультиплексора и сохранить в соответствующем поле данных.