如何在 React 项目中显示图像预览?
How can I make an image preview show up on a react project?
所以我有这个应用程序,我想 select 一张图片并将其上传到 mongodb 并在前端显示它,在 React 组件中。一切正常,但我不知道如何在上传之前显示图像的预览。我到目前为止是这样的:
selected 图像和预览的两个变量:
const [selectedFile, setSelectedFile] = React.useState(isAuthenticated().avatar || {});
const [imagePreview, setImagePreview] = React.useState('');
以及在输入 onChange 事件时触发的函数:
const fileSelectedHandler = evt => {
evt.preventDefault();
setSelectedFile(evt.target.files[0]);
const reader = new FileReader();
reader.onloadend = (selected) => setImagePreview(selected.target.result);
reader.readAsDataURL(evt.target.files[0]);
};
以及显示预览的图像。在这里我做到了,如果 imagePreview 不是一个空字符串来显示预览,否则只是已经从 mongodb:
加载的图像
{imagePreview != ''
? <img src={imagePreview} alt='preview' />
: <img src={`data:${mimeType};base64, ${thumb}`} alt={fileName} />}
当然还有表格:
<form onSubmit={uploadProfileImage}>
<input type="file" name="image" onChange={fileSelectedHandler}/>
<label htmlFor="profile-image">Choose image</label>
<input type="submit" value='Upload'/>
</form>
所有这些都不会破坏我的应用程序,并且在提交时上传新文件总是可以正常工作,但我不知道如何在上传前让预览可见。
您可以从文件中创建一个对象 URL 然后使用它:
handleFileChange(event) {
this.setState({
file: URL.createObjectURL(event.target.files[0])
})
}
render() {
return (
<div>
<input type="file" onChange={this.handleFileChange}/>
<img src={this.state.file}/>
</div>
);
}
您还可以在卸载阶段通过以下方式释放对象 URL 占用的内存:
URL.revokeObjectURL(objectUrl)
所以我有这个应用程序,我想 select 一张图片并将其上传到 mongodb 并在前端显示它,在 React 组件中。一切正常,但我不知道如何在上传之前显示图像的预览。我到目前为止是这样的:
selected 图像和预览的两个变量:
const [selectedFile, setSelectedFile] = React.useState(isAuthenticated().avatar || {});
const [imagePreview, setImagePreview] = React.useState('');
以及在输入 onChange 事件时触发的函数:
const fileSelectedHandler = evt => {
evt.preventDefault();
setSelectedFile(evt.target.files[0]);
const reader = new FileReader();
reader.onloadend = (selected) => setImagePreview(selected.target.result);
reader.readAsDataURL(evt.target.files[0]);
};
以及显示预览的图像。在这里我做到了,如果 imagePreview 不是一个空字符串来显示预览,否则只是已经从 mongodb:
加载的图像{imagePreview != ''
? <img src={imagePreview} alt='preview' />
: <img src={`data:${mimeType};base64, ${thumb}`} alt={fileName} />}
当然还有表格:
<form onSubmit={uploadProfileImage}>
<input type="file" name="image" onChange={fileSelectedHandler}/>
<label htmlFor="profile-image">Choose image</label>
<input type="submit" value='Upload'/>
</form>
所有这些都不会破坏我的应用程序,并且在提交时上传新文件总是可以正常工作,但我不知道如何在上传前让预览可见。
您可以从文件中创建一个对象 URL 然后使用它:
handleFileChange(event) {
this.setState({
file: URL.createObjectURL(event.target.files[0])
})
}
render() {
return (
<div>
<input type="file" onChange={this.handleFileChange}/>
<img src={this.state.file}/>
</div>
);
}
您还可以在卸载阶段通过以下方式释放对象 URL 占用的内存:
URL.revokeObjectURL(objectUrl)