За да качите файл, трябва да го обвиете във FormData
пример, както следва:
interface Profile {
photo: File;
}
updatePhoto(profile: Profile, id: string) {
const body = new FormData();
body.append('photo',profile.photo);
return this.http.post(`http://localhost:3000/profile/photo/${id}`, body,)
.map((response: Response) => response.json())
.catch((error: Response) => {
return Observable.throw(error.json());
});
}
Освен това вашият бекенд най-вероятно се проваля в следния раздел:
user.img.data = fs.readFileSync(req.body.photo);
Имайки предвид, че сега качвате формуляр с multipart/form-data
кодиране, ще трябва да използвате някакъв мидълуер, за да анализирате заявката във вашия бекенд, както е посочено в expressjs doc
Можете да използвате multer или express-fileupload
Ако изберете втория, ще ви трябва следното:
const fileUpload = require('express-fileupload');
router.use(fileUpload());// use express-fileupload as default parser for multipart/form-data encoding
router.post('/photo/:id', (req, res) => {
User.find({ _id: req.params.id })
.exec((err, user) => {
if (err) {
return res.status(500).json({
title: 'An error occured',
error: err
});
}
user.img.data = req.files.photo.data;
user.img.contentType = 'image/png';
user.save((err, obj) => {
if (err) {
throw err
}
console.log('success')
})
});
});