文章内容大多来自学习摘记、实践思考。
form 提交的 get、post 区别
- 获取数据用 get,get 速度快、但有长度限制
- get 只能向服务器发送 ASCII 字符,这是 W3C 组织规定的,所以任何参数最后都要以 ASCII 码的形式传递,不能有中文字符。
- get 编码方式是根据当前网页采用选择的编码来编码。所以,当前网页如果是 gbk 编码,get 的参数也会被编码为 gbk,用
decodeURI()
或decodeURIComponent()
(它们都是解 utf-8 编码的) 解码就会出现 js 异常抛错。 - 对于要拼接到 uri 后面的中文参数进行
encodeURIComponent
或者encodeURI
的 utf-8 编码方法,后端处理参数的解码方式一般也都是 utf-8 方式,这样不会出现后端获取中文乱码情况。 - 浏览器发送数据给服务器时,会把数据进行浏览器编码成字节流。
- 提交数据用 post,post 慢、理论上无长度限制 (服务器端可能会规定最大长度),post 相对安全。
- 注意:如果用 post 做查询,刷新浏览器会弹出 “是否重复提交数据” 的弹框。应该改用 get 来做。
form 的 method、action、target、enctype
- method 默认值为 get
- action 属性表示 向何处发送表单数据 (一般为url)。
- 如果不设置、或为空,则提交到本页面
- 如果 get 方式提交、action url 中参数都会被丢弃;post 则不会。
- target 属性规定在何处打开 action URL
- 值可为:
_self(默认值) | _blank | _parent | _top | framename
- 当设置为 隐藏的 iframe name 时,能实现假的 表单提交无刷新效果。
- 值可为:
- enctype 规定在发送表单数据之前如何对其进行编码
- 设置:
application/x-www-form-urlencoded
(默认值),按照key1=val1&key2=val2
的方式进行编码,key 和 val 都进行了 URL 转码 - 设置:
multipart/form-data
,使用表单上传文件时,必须让 form 的 enctype 等于这个值 - 设置:
application/json
,发送消息为序列化后的 JSON 字符串
- 设置:
上传文件
-
form 同步上传 (使浏览器不刷新的做法: form target 指向隐藏的 iframe, 服务端 action 返回
window.top.window['callback'](data)
) -
XMLHttpRequest 2 支持真正异步上传, form enctype 属性为
multipart/form-data
, 构造 FormData 对象. -
使用 fetch + FormData 上传文件时、不能设置 headers 的 Content-Type (或设置为 undefined),浏览器会自动设置为合适值 (比如
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIn312MOjBWdkffIM
)。参考 https://stackoverflow.com/a/39281156/2190503 和 https://stanko.github.io/uploading-files-using-fetch-multipart-form-data/ -
用通常的 http://localhost:8000 访问服务端上传文件的接口时,会报出 跨域 错误,而用 http://127.0.0.1 或其他绑定的 host 都没问题,为什么?
-
服务端需要设置“松散的 ctoken 检测”?
上传前先压缩文件?以减少上传文件大小,怎么做?
下载
Ajax 不能下载文件。可以用 form 表单提交下载,或 iframe 方式下载。 单纯使用js下载文件、纯前端-生成文件并下载
点击需要下载文件的连接,后端处理:Content-type: application/octet-stream
、Content-Disposition: filename=\