You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// from http://react-component.github.io/upload/functiongetError(option,xhr){constmsg=`cannot post ${option.action}${xhr.status}'`;consterr=newError(msg);err.status=xhr.status;err.method='post';err.url=option.action;returnerr;}functiongetBody(xhr){consttext=xhr.responseText||xhr.response;if(!text){returntext;}try{returnJSON.parse(text);}catch(e){returntext;}}// option {// onProgress: (event: { percent: number }): void,// onError: (event: Error, body?: Object): void,// onSuccess: (body: Object): void,// data: Object,// filename: String,// file: File,// withCredentials: Boolean,// action: String,// headers: Object,// }exportdefaultfunctionupload(option){constxhr=newXMLHttpRequest();if(option.onProgress&&xhr.upload){xhr.upload.onprogress=functionprogress(e){if(e.total>0){e.percent=e.loaded/e.total*100;}option.onProgress(e);};}constformData=newFormData();if(option.data){Object.keys(option.data).map(key=>{formData.append(key,option.data[key]);});}formData.append(option.filename,option.file);xhr.onerror=functionerror(e){option.onError(e);};xhr.onload=functiononload(){// allow success when 2xx status// see https://github.com/react-component/upload/issues/34if(xhr.status<200||xhr.status>=300){returnoption.onError(getError(option,xhr),getBody(xhr));}option.onSuccess(getBody(xhr),xhr);};xhr.open('post',option.action,true);// Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179if(option.withCredentials&&'withCredentials'inxhr){xhr.withCredentials=true;}constheaders=option.headers||{};// when set headers['X-Requested-With'] = null , can close default XHR header// see https://github.com/react-component/upload/issues/33if(headers['X-Requested-With']!==null){xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');}for(consthinheaders){if(headers.hasOwnProperty(h)&&headers[h]!==null){xhr.setRequestHeader(h,headers[h]);}}xhr.send(formData);// 返回abort方法,用于在组件状态发生改变时手动结束未完成的请求return{abort(){xhr.abort();},};}
使用FormData + ajax完成带文件的表单提交(jquery)
$('#button').on('click',function(){varfd=newFormData(document.querySelector("form"));// fd.append("CustomField", "This is some extra data");$.ajax({url: "stash",type: "POST",data: fd,processData: false,// 不处理数据;(默认传入data中的object数据会被自动序列化为字符串,以匹配默认的contentType,如果想传输除此以外的数据类型,则需要设为false)contentType: false// 不设置内容类型(防止影响分界符的解析)});returnfalse;})
基本表单提交
在form元素上始终包含
action
和method
是最佳实践, 默认点击type为submit的元素会触发表单提交,该提交为同步请求。默认表单的内容通过遍历含有name的表单元素的value来获得(file元素默认为文件名),使用
get
方法时,参数会跟在url后面,通过&符号隔开(?a=1&b=2)
;使用post
方法时,参数会带着请求体中。enctype
可以用了设置请求的Content-Type
, 他的默认值是application/x-www-form-urlencoded
表示已编码为URL参数的表单数据
。如果表单中包含不可序列化的数据,例如二进制数据(文件),此时就需要将enctype
设为multipart/form-data
,那么数据将被分为多个部分分别处理:当然我们只能使用
post
方法来提交这个请求。使用
FormData + ajax
完成带文件的表单提交(原生js)FormData对象的append方法可以手动像其中添加表单字段,也可以直接通过一个表单元素来直接构建一个
FormData对象
:下面给出一个图片上次的表单提交的请求示例
使用
FormData + ajax
完成带文件的表单提交(jquery)jquery提交基础表单
对于不包含文件的普通表单的提交,我们也推荐通过ajax来提交,通过
serialize
方法快速获取表单的内容。使用原生js实现ajax序列化和表单提交
其实现主要包含两个部分,表单内容的序列化(serialize)和请求头相关参数的设置(根据请求类型和数据类型),其实现比较复杂,这里有一个参考。
参考
The text was updated successfully, but these errors were encountered: