【问题标题】:Use React Dropzone Uploader with custom input field使用带有自定义输入字段的 React Dropzone Uploader
【发布时间】:2019-08-09 21:54:04
【问题描述】:

我可以在 react dropzone 上传器中集成输入吗?基本上我从输入中得到的文件应该去 dropzone 上传器。

React 文件拖放区:https://github.com/fortana-co/react-dropzone-uploader

<Dropzone
    maxFiles={1}
    accept="image/*"
    getUploadParams={getUploadParams}
    onChangeStatus={handleChangeStatus}
    multiple={false}
    ref={setInputEl}
>
    <input
        ref={setInputEl}
        accept="image/*"
        className={classes.input}
        id="icon-button-file"
        type="file"
        onChange={handleFileChange}
    />
</Dropzone>

【问题讨论】:

    标签: reactjs file-upload dropzone react-dropzone


    【解决方案1】:

    是的,你可以。

    来自the official live examples

    // https://github.com/quarklemotion/html5-file-selector
    import { getDroppedOrSelectedFiles } from 'html5-file-selector'
    
    const CustomInput = () => {
      const handleSubmit = (files, allFiles) => {
        console.log(files.map(f => f.meta))
        allFiles.forEach(f => f.remove())
      }
    
      const getFilesFromEvent = e => {
        return new Promise(resolve => {
          getDroppedOrSelectedFiles(e).then(chosenFiles => {
            resolve(chosenFiles.map(f => f.fileObject))
          })
        })
      }
    
      return (
        <Dropzone
          accept="image/*,audio/*,video/*,.pdf"
          getUploadParams={() => ({ url: 'https://httpbin.org/post' })}
          onSubmit={handleSubmit}
          InputComponent={Input}
          getFilesFromEvent={getFilesFromEvent}
        />
      )
    }
    

    其中Input 是您提供的自定义组件:

    const Input = ({ accept, onFiles, files, getFilesFromEvent }) => {
      const text = files.length > 0 ? 'Add more files' : 'Choose files'
    
      return (
        <label style={{ backgroundColor: '#007bff', color: '#fff', cursor: 'pointer', padding: 15, borderRadius: 3 }}>
          {text}
          <input
            style={{ display: 'none' }}
            type="file"
            accept={accept}
            multiple
            onChange={e => {
              getFilesFromEvent(e).then(chosenFiles => {
                onFiles(chosenFiles)
              })
            }}
          />
        </label>
      )
    }
    

    澄清这与您的代码有何不同:您只是将自定义&lt;input&gt; 添加为&lt;Dropzone&gt; 的子代。您需要按照上述方式进行操作,以便将两者正确“连接”在一起。

    【讨论】:

    • 它说找不到 getFilesFromEvent。此外,我试图一次只插入 1 个文件。它有什么作用?
    • 抱歉,我没有包含所有内容。但是查看我包含的链接,我从那里得到了代码。
    • 在我上面发布的代码中,为什么 dropzone 上传器无法与自定义输入字段集成?
    • 因为您只是将自定义 &lt;input&gt; 添加为 &lt;Dropzone&gt; 的子级。自定义 &lt;Input&gt; 充当两者之间的“粘合剂”,因此它们正确地“连接”在一起。
    • 如果我只需要上传1个文件,如何修改代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多