我是第一次设置文件上传功能。我有一个反应前端和一个将存储文件的快速服务器。我设置好了,所以用户可以提交文件,并按照我喜欢的方式保存在快递服务器上。但是,每当用户提交表单时,他们就会从反应前端(在端口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模块以使其自表单起作用(除了重定向)完美无瑕。这里有一个简单的解决方案,可以防止表单在提交表单数据时尝试加载服务器端页面吗?
答案 0 :(得分: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(); } }>
答案 1 :(得分:1)
以下是我处理使用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方法与<input type="file" onChange={this.handleChange} />
然后在表单提交处理程序
中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
})
};
答案 2 :(得分:0)
在您的Component中创建一个处理提交的方法,在表单的onSubmit
属性中调用它:onSubmit="{this.handleSubmit}"
并以异步方式发布您的数据。