Итак, я успешно использовал multer для загрузки изображений на mongodb, но проблема в том, что я не знаю, как заставить их показываться на странице.
const [selectedFile, setSelectedFile] = React.useState(getUser().avatar);
// getUser() function is returning the logged user from localStorage
const fileSelectedHandler = evt => setSelectedFile(evt.target.files[0]);
const uploadProfileImage = async (evt) => {
evt.preventDefault();
const formData = new FormData();
formData.append('image', selectedFile);
const config = {
headers: {
'content-type': 'multipart/form-data',
},
};
await axios.put(`http://localhost:8080/avatar/${id}`, formData, config)
.then(response => {
localStorage.setItem(localStorageName, JSON.stringify({ ...getUser(), avatar: response.data.user.avatar }));
}).catch(error => console.log(error));
}
настройки multer в контроллере маршрута
const multer = require('multer');
const DIRECTORY = './uploads/images';
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, DIRECTORY);
},
filename: function (req, file, cb) {
cb(null, `IMAGE-${Date.now()}.${path.extname(file.originalname)}`);
},
});
const upload = multer({
// storage: storage,
storage: multer.memoryStorage(),
fileFilter: (req, file, cb) => {
if (file.mimetype == 'image/png' || file.mimetype == 'image/jpg' || file.mimetype == 'image/jpeg') {
cb(null, true);
} else {
cb(null, false);
return cb(new Error('Only .png, .jpg and .jpeg format allowed!'));
}
},
limits: { fileSize: 1024 * 1024 * 2 },
});
файл маршрута загрузки изображения
router.put('/avatar/:uid', upload.single('image'), avatar);
Все это успешно сохраняет буфер изображения в mongodb:
{ ... аватар: "очень длинная строка" ...}
Но проблема в том, что я не знаю, как заставить это изображение показываться на веб-странице.
<img src={getUser().avatar} />
<a href="#">
<form onSubmit={uploadProfileImage}>
<input type="file" name="image" onChange={fileSelectedHandler} />
<button type="submit">Upload</button>
</form>
<span>Add Photo</span>
</a>
сервер загрузки изображений
const avatar = (req, res) => {
const image = req.file.buffer.toString('base64');
User.findByIdAndUpdate(req.params.uid, { $set: { avatar: image }}, { new: true, upsert: true })
.exec((error, user) => {
if (error) {
return res.status(400).json({
message: error.message,
});
}
console.log(req.file)
res.status(201).json({
message: 'Avatar added successfully',
user
});
});
};