У меня проблема с отображением файла изображения из моей базы данных mongodb в моих компонентах Profile и EditProfile. когда я загружаю файл с моим компонентом Editprofile, он сохраняется в базе данных, но когда я хочу получить его, чтобы просмотреть файл изображения в компоненте моего профиля, я получил взамен сломанное изображение, и если я использую alt
, то alt
это то, что возвращается в представлении. Я использовал грозный метод PUT
, чтобы сохранить файл изображения в моей базе данных, и я установил его в качестве данных буфера в моей модели пользователя базы данных, примерно так
photo: {
data: buffer,
contentType: string
}
это то, что возвращается после данные успешно сохранены в базе данных
{ photo:
{ contentType: 'image/jpeg',
data:
Binary {
_bsontype: 'Binary',
sub_type: 0,
position: 780831,
buffer:
<Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 02 01 00 60 00 60 00 00 ff ee 00 0e 41 64 6f 62 65 00 64 00 00 00 00 01 ff e1 14 23 45 78 69 66 00 00 4d 4d 00 2a ... > } },
_id: 5ea23ae949389a14c8dab6c8,
name: 'name',
email: 'name@gmail.com',
salt: '0.9588954503373059',
hashed_password: '3f9867a4786e8944d565653959110698cdcc196c',
created: 2020-04-24T01:03:37.457Z,
__v: 0,
about: 'Getting to my greatness',
updated: 2020-05-05T00:47:53.899Z }
Теперь проблема заключается в отображении изображения в компоненте просмотра профиля, я использую конечную точку api
для отображения фотографии, на которой я создал маршрут и контроллер для маршрута. js
router.route('/api/users/photo/:userId')
.get(userControl.photo, userControl.defaultPhoto)
router.route('/api/users/defaultphoto')
.get(userControl.defaultPhoto)
контроллер. js
const photo = (req, res, next) => {
if(req.profile.photo.data) {
res.set("Content-Type", res.profile.photo.contentType)
return res.send(req.profile.photo.data)
}
next()
}
const defaultPhoto = (req, res) => {
return res.sendFile(profilePic)
}
Затем в моем компоненте представления профиля я вызвал api
как это в методе рендеринга компонента класса
render() {
const {classes} = this.props
const {redirectToSignin, user} = this.state
const photoUrl = user._id
? `/api/users/photo/${user._id}?${new Date().getTime()}`
: `/api/users/defaultphoto`
if(redirectToSignin) {
return (<Redirect to="/signin"/>)
}
return (
<div>
<Paper className={classes.root} elevation={4}>
<Typography type="title" className={classes.title}>Profile</Typography>
<List dense>
<ListItem>
<ListItemAvatar>
<Avatar src={photoUrl} className={classes.bigAvatar}/>
</ListItemAvatar>
<ListItemText primary={user.name} secondary={user.email}/>
{auth.isAuthenticated().user && auth.isAuthenticated().user._id == user._id &&
(<ListItemSecondaryAction>
<Link to={'/user/edit/' + user._id}>
<IconButton aria-label="Edit" color="primary">
<Edit/>
</IconButton>
</Link>
<DeleteUser userId={user._id}/>
</ListItemSecondaryAction>)}
</ListItem>
<Divider/>
<ListItem>
<ListItemText primary={user.about} secondary={"Joined: " + (new Date(user.created).toDateString())}/>
</ListItem>
</List>
</Paper>
</div>
)
}
Я использую материал ui Avatar
для отображения изображения, и ничего не отображается Я также пробовал html img
элемент все еще не работает
const photoUrl = user._id
? `/api/users/photo/${user._id}?${new Date().getTime()}`
: `/api/users/defaultphoto`
<ListItemAvatar>
<Avatar src={photoUrl} className={classes.bigAvatar}/>
</ListItemAvatar>
Мне нужна помощь в решение этого вопроса будет очень признательно. Спасибо