【问题标题】:Prevent Redirect on File Upload through form Submittal (React, Express, Multer)防止通过表单提交(React、Express、Multer)重定向文件上传
【发布时间】:2018-04-20 05:38:25
【问题描述】:

我是第一次设置文件上传功能。我有一个反应前端和一个将存储文件的快速服务器。我已经设置好了,所以用户可以提交文件,并以我希望它保存在快速服务器上的方式保存它。但是,每当用户提交表单时,他们都会从反应前端(端口 3000)重定向到服务器上的 POST 路由(端口 3050)。我不知道这是发布请求的默认行为,我希望这会使用户留在页面上。

我想避免这种行为,但不确定最好的解决方法。我尝试构建一个充当 AXIOS 请求的操作,但在访问 AXIOS 请求中的表单数据(尤其是文件数据)时遇到问题。我的理解是 AXIOS 中不支持多部分表单数据。

Event.preventdefault 是显而易见的选择,但任何实现都会阻止表单提交获取适当的表单数据并将其发送出去。

表单的代码包含在下面(此版本使用单击事件来阻止默认事件并调度操作 - 操作会触发,但如上所述不会传递任何相关信息):

        <div className="modal-wrapper">
            <h3 className="title__h3">Upload Data</h3>
            <p>Drag and drop anywhere or choose a file to upload.</p>
            <p>.csv or .xlsx</p>
            <form className="upload-form" ref="uploadForm" id="uploadForm" action="http://localhost:3050/upload" method="POST" enctype="multipart/form-data">
                <input name="fileName" placeholder="Name the file you're uploading here"/>
                <input type="file" name="upl" id="file" className="inputfile" />
                <label htmlFor="file" className="btn btn__white-outline btn__full-width">Select a File</label>
                <input onClick={this.submitForm} type="submit" value="submit" />
            </form>
        </div>;

我的简单 Multer 路线:

app.post('/upload', upload.single('upl'), function(req,res,next) {
  return false
})

我的理解是,没有原生支持通过 Axios 发送多部分表单项,我想避免拉入 FormData 模块以使其工作,因为表单(重定向除外)完美无缺.这里是否有一个简单的解决方案可以防止表单在仍然提交表单数据的同时尝试加载服务器端页面?

【问题讨论】:

    标签: reactjs express file-upload


    【解决方案1】:

    在您的 submitForm 处理程序中,传递对事件的引用并使用 event.preventDefault()。

        submitForm(event) {
            event.preventDefault();
            ...other code here...
        }
    

    你也可以试试

    <form className="upload-form" ref="uploadForm" id="uploadForm" action="http://localhost:3050/upload" method="POST" enctype="multipart/form-data" onSubmit={ (event) => { event.preventDefault(); } }>
    

    【讨论】:

    • 感谢您的帮助。我遇到的问题是通过另一个函数发送请求(在您的示例中将是“...此处的其他代码...”块)需要我使用 Axios。我花了最后几个小时试图弄清楚如何通过 Axios 发送 req.file 并且无法让它合作。但是,在没有 Axios 的情况下通过表单提交除了页面刷新之外表现完美。我希望有一些命令可以让我模拟香草表单提交而无需刷新,但我可能不得不放弃 Axios。
    • 参见下文,了解如何使用 Axios 处理文件上传。不要忘记投票任何有用的答案...
    【解决方案2】:

    以下是我使用 Axios 处理提交文件的方式

    handleChange = ( event ) => {
        const fileReader = new FileReader();
        const fileToUpload = event.target.files[0];
    
        fileReader.onload = ( upload ) => {
            const allFiles = [ ...this.state.allFiles ].concat( upload.target.result );
    
            this.setState({ 
                allFiles
            });
        };
    
        fileReader.readAsDataURL(fileToUpload);
    };
    

    handleChange方法与&lt;input type="file" onChange={this.handleChange} /&gt;的onChange事件绑定

    然后在表单中提交处理程序

    handleSubmit = ( event ) => {
        event.preventDefault(); //So the page does not refresh
        const { allFiles } = this.state;
        const Promises = [];
    
        allFiles.forEach( file => {
            Promises.push( Axios({
                url: "a url goes here",
                method: "POST",
                data: {
                    file: file, //This is a data url version of the file
                }
            }));    
        });
    
        Axios.all(Promises).then( result => {
            alert(result.message); //Display if it uploaded correctly
        })
    };
    

    【讨论】:

      【解决方案3】:

      在您的组件中创建一个处理提交的方法,在您的表单的 onSubmit 属性中将其称为:onSubmit="{this.handleSubmit}" 并以异步方式发布您的数据。

      【讨论】:

      • 随着我一直在探索这个问题,问题变得越来越清楚,我只是无法以异步方式发布文件数据。我一直在使用 AXIOS 来发出我所有的发布请求,但似乎找不到一种通过包含该文件的 request.file 发送的好方法,以便我的服务器正确存储它。我已将其切换并尝试从请求正文中保存文件,但除了 [object Object] 之外无法将其作为任何东西传递。简而言之,您的解决方案是正确的,但我无法使用我正在使用的工具创建功能正常的异步帖子。
      • @SadBonesMalone 对不起,当我回答你的问题时我很着急,我会完成一些事情,我会在我的回答中更详细(如果没有人已经回答你)跨度>
      • 别担心!我想出了一个解决方案,我很快就会添加到我的答案中。感谢您的帮助。
      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 2015-12-01
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2017-07-29
      • 2010-11-18
      相关资源
      最近更新 更多