在 React 中上传之前获取图像预览

IT技术 javascript jquery reactjs
2021-03-15 17:52:16

这里有很多这样的例子,但似乎找不到任何react。我已经设法将 vanilla js 转换为react但出现错误

答案看起来很简单,所以我在这里做出react:

getInitialState: function(){
  return{file: []}
},

_onChange: function(){
  // Assuming only image
  var file = this.refs.file.files[0];
  var reader = new FileReader();
  var url = reader.readAsDataURL(file);
  console.log(url) // Would see a path?
  // TODO: concat files for setState
},

render: function(){
 return(
  <div>
    <form>
      <input 
        ref="file" 
        type="file" 
        name="user[image]" 
        multiple="true"
        onChange={this._onChange}/>
     </form>
    {/* Only show first image, for now. */}
    <img src={this.state.file[0} />
  </div>
 )
};

基本上我看到的所有答案都显示了我所拥有的。React 应用程序有什么不同吗?

关于答案:

在此处输入图片说明

6个回答

没有区别,只需在load活动结束后阅读您的图片即可load end事件处理程序之后只需设置您的状态:

getInitialState: function(){
  return{file: []}
}

_onChange: function(){
  // Assuming only image
  var file = this.refs.file.files[0];
  var reader = new FileReader();
  var url = reader.readAsDataURL(file);

   reader.onloadend = function (e) {
      this.setState({
          imgSrc: [reader.result];
      })
    }.bind(this);
  console.log(url) // Would see a path?
  // TODO: concat files
},

render: function(){
 return(
  <div>
    <form>
      <input 
        ref="file" 
        type="file" 
        name="user[image]" 
        multiple="true"
        onChange={this_onChange}/>
     </form>
    {/* Only show first image, for now. */}
    <img src={this.state.imgSrc} />
  </div>
 )
}
更新您的答案,以便我结束这个问题。谢谢。
2021-04-24 17:52:16
这个答案很旧,但我想分享我遇到的东西,无需做初始化 fileReader 和其他东西的所有繁琐工作,您可以 const file = e.target.files[0]; if (!file) return; // else it will throw an parse error const url = URL.createObjectURL(file); url绑定到<img src={url} />这样。希望有人觉得这有帮助。
2021-04-24 17:52:16
在函数中它可能是空的,因为我们已经绑定了加载结束函数,调试渲染函数,并检查它应该更新的状态
2021-04-29 17:52:16
我发现了您代码中的错误。更改reader.result;[reader.result]谢谢!
2021-04-30 17:52:16
谢谢。result散列中为空,但在外面时不为空。说得通?reader显示散列但result为空。见帖子中的图片。
2021-05-20 17:52:16

扩展Cels 的回答,并避免内存泄漏,createObjectURL正如@El Anonimo 警告的那样,我们可以useEffect像这样在组件卸载后创建预览和清理

useEffect(() => {
   // create the preview
   const objectUrl = URL.createObjectURL(selectedFile)
   setPreview(objectUrl)

   // free memory when ever this component is unmounted
   return () => URL.revokeObjectURL(objectUrl)
}, [selectedFile])

完整的代码看起来像这样

export const ImageUpload = () => {
    const [selectedFile, setSelectedFile] = useState()
    const [preview, setPreview] = useState()

    // create a preview as a side effect, whenever selected file is changed
    useEffect(() => {
        if (!selectedFile) {
            setPreview(undefined)
            return
        }

        const objectUrl = URL.createObjectURL(selectedFile)
        setPreview(objectUrl)

        // free memory when ever this component is unmounted
        return () => URL.revokeObjectURL(objectUrl)
    }, [selectedFile])

    const onSelectFile = e => {
        if (!e.target.files || e.target.files.length === 0) {
            setSelectedFile(undefined)
            return
        }

        // I've kept this example simple by using the first image instead of multiple
        setSelectedFile(e.target.files[0])
    }

    return (
        <div>
            <input type='file' onChange={onSelectFile} />
            {selectedFile &&  <img src={preview} /> }
        </div>
    )
}
嘿,现在是 2020 年!好的!
2021-05-02 17:52:16
如何提供移除选项?
2021-05-08 17:52:16
2021 年 11 月仍然有效。这为我节省了很多压力。亲爱的朋友
2021-05-08 17:52:16
嘿@Jay Wick URL.createObjectURL 被弃用了吗?偶然发现这个链接:developers.google.com/web/updates/2018/10/...
2021-05-15 17:52:16
这里的关键是 URL.createObjectURL(selectedFile)
2021-05-19 17:52:16

这是一个简单而有效的解决方案,它显示所有选定的图像

getInitialState: function(){
  return{file: []}
}

_onChange: (event)=>{
    this.setState({
        imgs: event.target.files
    })
},

render: function(){
 return(
  <div>
    <form>
      <input 
        ref="file" 
        type="file" 
        name="user[image]" 
        multiple="true"
        onChange={this._onChange}/>
    </form>

    {/* Display all selected images. */}        
    {this.state.imgs && [...this.state.imgs].map((file)=>(
       <img src={URL.createObjectURL(file)} />
    ))}

  </div>
 )
}
请记住,每次createObjectURL(file)生成的 URL 都会保留在内存中。为了防止内存泄漏,调用URL.revokeObjectURL(<previously_created_ objectUrl>)从内存中删除旧图像 URL。发现于medium.com/@scyrizales/...
2021-04-29 17:52:16

请这对我来说完美无缺

state = {
  img: logo
}

handleChangeImage = e => {
  this.setState({[e.target.name]: URL.createObjectURL(e.target.files[0])})
}

<input type="file" id="img" name="img" accept="image/*" className="w-100" onChange={this.handleChangeImage}/>

<img src={this.state.img} alt="img"/>

查看链接了解更多详情https://medium.com/@650egor/react-30-day-challenge-day-2-image-upload-preview-2d534f8eaaa

哇,我花了FileReader()大约 2 个小时来预览多张照片,实际上URL.createObjectURL非常简单并且在所有浏览器中都受支持。
2021-05-13 17:52:16

有我的解决方案。非常简单易用。

JSX

<form onSubmit={this.onSubmit} >      
      <input
         ref="uploadImg"
         type="file"
         name="selectedFile"
         onChange={this._onChange}
        />
</form>

<img src={this.state.imageUrl} />

和功能

  _onChange = (e) => {

    const file    = this.refs.uploadImg.files[0]
    const reader  = new FileReader();

    reader.onloadend = () => {
        this.setState({
            imageUrl: reader.result
        })
    }
    if (file) {
        reader.readAsDataURL(file);
        this.setState({
            imageUrl :reader.result
        })
    } 
    else {
        this.setState({
            imageUrl: ""
        })
    }
}

当然,你需要有状态,比如imageUrl我们在 jsx 中的 src。

使用ObjectURL而不是 base64 ...
2021-04-28 17:52:16