Open NARUTOne opened 7 years ago
var objectToFormData =function(obj, form, namespace) {
var fd = form || new FormData();
var formKey;
if(obj instanceof Array){
for(var item of obj ){
if(typeof item === 'object' && !(item instanceof File)){
this.objectToFormData(item, fd, namespace+'[]');
}else{
// 若是数组则在关键字后面加上[]
fd.append(namespace+'[]',item)
}
}
}else{
for(var property in obj) {
if(obj.hasOwnProperty(property) && obj[property]) {
if(namespace) {
// 若是对象,则这样
formKey = namespace + '[' + property + ']';
} else {
formKey = property;
}
// if the property is an object, but not a File,
// use recursivity.
if(typeof obj[property] === 'object' && !(obj[property] instanceof File)) {
// 此处将formKey递归下去很重要,因为数据结构会出现嵌套的情况
this.objectToFormData(obj[property], fd, formKey);
} else {
// if it's a string or a File object
fd.append(formKey, obj[property]);
}
}
}
}
return fd;
};
var params = {
name:'testname',
obj:{
innername:'innername',
innerage:23,
inneraddress:[
{
city:'shanghai',
area:'pudong'
},
{
city:'jiangsu',
area:'nanjing'
},
]
}
}
[keys:]
name
obj[innername]
obj[innerage]
obj[inneraddress][][city]
obj[inneraddress][][area]
obj[inneraddress][][city]
obj[inneraddress][][area]
[values]:
testname
innername
23
shanghai
pudong
jiangsu
nanjing
前端学习随记の下载上传篇 —— 上传篇
上传の方式
Form && Input
采用传统的form表单或异步ajax上传。至于以前通过iframe来进行异步上传,这里不详细介绍,想了解可以看 http://www.ruanyifeng.com/blog/2012/08/file_upload.html。
接着采用js来获取file对象,进行异步上传。
HTML5 拖拽操作文件
FileReader API
DataURI && URL
DataURI DataURI对象,允许将一个小文件进行编码后嵌入到另外一个文档里。
整体可以视为三部分,即声明:参数+数据,逗号左边的是各种参数,右边的是数据。
通过FileReader 的readAsDataURL方法获得:
有时候我们需要将DataURI对象转blob对象:
URL对象 我们除了可以使用base64字符串作为内容的DataURI将一个文件嵌入到另外一个文档里,还可以使用URL对象。URL对象用于生成指向File对象或Blob对象的URL。
静态方法会创建一个 DOMString,它的 URL 表示参数中的对象。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示着指定的 File 对象或者 Blob 对象。
静态方法用来释放一个之前通过调用 window.URL.createObjectURL() 创建的已经存在的 URL 对象。当你结束使用某个 URL 对象时,应该通过调用这个方法来让浏览器知道不再需要保持这个文件的引用了
对象URL来显示图片:
上传实例:以二进制流上传文件
blob对象
Blob对象有两个只读属性:
blob创建
1)构成函数 Blob构造函数,接受两个参数。第一个参数是一个包含实际数据的数组,第二个参数是数据的类型,这两个参数都不是必需的。数组元素可以是任意多个的ArrayBuffer,ArrayBufferView (typed array), Blob,或者 DOMString对象。例如:
如果在浏览器端js生成的内容,想让浏览器进行下载要如何办到呢?DataURI可以实现这个效果,但是DataURI的文件类型被限制了,我们这里可以变通一下实现blob对象。
2)Blob对象的slice方法生成blob对象 Blob对象的slice方法,将二进制数据按照字节分块,返回一个新的Blob对象。
大文件分割上传:
终语