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

Syl*_*lar 14 javascript jquery reactjs

这里有很多这样的例子,但似乎无法找到任何反应.我设法转换香草js作出反应,但得到一个错误.

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

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>
 )
};
Run Code Online (Sandbox Code Playgroud)

基本上我见过的所有答案都显示了我所拥有的东西.React应用程序有何不同?

关于答案:

在此输入图像描述

jay*_*jay 41

扩展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])
Run Code Online (Sandbox Code Playgroud)

完整的代码看起来像这样

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>
    )
}
Run Code Online (Sandbox Code Playgroud)

  • 杰伊的GG。2022 年 6 月仍然完美运行 (3认同)

Piy*_*oor 25

没有区别,只需在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>
 )
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现了你的代码中的错误.将`reader.result;`更改为`[reader.result]`谢谢!! (4认同)

小智 7

这是一个很好的例子: https ://www.kindacode.com/article/react-show-image-preview-before-uploading/

const App = () => {
  const [selectedImage, setSelectedImage] = useState();

  const imageChange = (e) => {
    if (e.target.files && e.target.files.length > 0) {
      setSelectedImage(e.target.files[0]);
    }
  };

  const removeSelectedImage = () => {
    setSelectedImage();
  };

  return (
    <>
      <div>
        <input
          accept="image/*"
          type="file"
          onChange={imageChange}
        />

        {selectedImage && (
          <div>
            <img
              src={URL.createObjectURL(selectedImage)}
              alt="Thumb"
            />
            <button onClick={removeSelectedImage}>
              Remove This Image
            </button>
          </div>
        )}
      </div>
    </>
  );
};
Run Code Online (Sandbox Code Playgroud)


Cel*_*els 5

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

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>
 )
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,每次`createObjectURL(file)`时,结果URL都会保留在内存中。为了防止内存泄漏,请调用URL.revokeObjectURL(&lt;previously_created_ objectUrl&gt;)从内存中删除旧的图像URL。可在https://medium.com/@scyrizales/dont-forget-that-if-you-going-to-use-this-to-show-images-when-you-replace-the-image-with上找到-a688b397725b (2认同)

Sol*_*rku 5

请这对我来说非常有效

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"/>
Run Code Online (Sandbox Code Playgroud)

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