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
readAsBinaryString 通过用于传送到后端作为文件内容直接存储,一般还需要经过Array Buffer的实例存起来再传输。
Data URL是一种将小文件直接嵌入文档的方案。这里的小文件通常是指图像与 html 等格式的文件。
事件
FileReader的读取是个异步的过程,读取结果保存在 result 属性中:
fr.onload = function() {
this.result;
};
实例一:上传文件并读取为dataURI
<input type="file" name="file" οnchange="showPreview(this)" />
<img id="portrait" src="" width="70" height="75">
<script type="text/javascript">
function showPreview(source) {
var file = source.files[0];
if(window.FileReader) {
var fr = new FileReader();
fr.onloadend = function(e) {
document.getElementById("portrait").src = e.target.result;
};
fr.readAsDataURL(file);
}
}
</script>
实例二:拖拽图片进行预览
拖拽图片到一个容器,然后另一个容器能同时展示出改图:
var box = document.getElementById("box");
var box2 = document.getElementById("box2");
box.οndragοver = function(e) {
e = e || window.event
e.preventDefault();
this.style.background = "#ddd"
}
box.οndrοp = function(e) {
e.preventDefault();
this.style.background = "#fff"
var files = e.dataTransfer.files;
for (var i = 0; i < files.length; i++) {
if (files[i].type.indexOf("image") != -1) {
var fReader = new FileReader();
fReader.readAsDataURL(files[i]);
fReader.οnlοad = function() {
var img = document.createElement("img");
img.src = this.result;
box2.appendChild(img)
}
} else {
alert("无法获取信息,您拖入的不是图片文件")
}
}
}
Blob
在一般的Web开发中,很少会用到Blob,但Blob可以满足一些场景下的特殊需求。Blob,Binary Large Object的缩写,代表二进制类型的大对象。Blob的概念在一些数据库中有使用到,例如,MYSQL中的BLOB类型就表示二进制数据的容器。在Web中,Blob类型的对象表示不可变的类似文件对象的原始数据,通俗点说,就是Blob对象是二进制数据,但它是类似文件对象的二进制数据,因此可以像操作File对象一样操作Blob对象,实际上,File继承自Blob。
var formData = new FormData();
formData.append("username", "sam");
// HTML file input, chosen by user
formData.append("userfile", fileInputElement.files[0]);
// JavaScript file-like object
var content = 'hey!'; // the body of the new file...
var blob = new Blob([content], { type: "text/xml"});
formData.append("webmasterfile", blob);
var request = new XMLHttpRequest();
request.open("POST", url);
request.send(formData);
获取或修改FormData方式
方案1:创建一个空的FormData对象,然后再用append方法逐个添加键值对:
var formdata = new FormData();
formdata.append("name", "呵呵");
formdata.append("url", "http://www.baidu.com/");
方案2:取得form元素对象,将它作为参数传入FormData对象中!
var formobj = document.getElementById("form");
var formdata = new FormData(formobj);
方案3:利用form元素对象的getFormData方法生成它!
var formobj = document.getElementById("form");
var formdata = formobj.getFormData()
FileReader
FileReader接口提供了读取文件的方法和包含读取结果的事件模型。
方法
事件
FileReader的读取是个异步的过程,读取结果保存在 result 属性中:
实例一:上传文件并读取为dataURI
实例二:拖拽图片进行预览
拖拽图片到一个容器,然后另一个容器能同时展示出改图:
Blob
在一般的Web开发中,很少会用到Blob,但Blob可以满足一些场景下的特殊需求。Blob,Binary Large Object的缩写,代表二进制类型的大对象。Blob的概念在一些数据库中有使用到,例如,MYSQL中的BLOB类型就表示二进制数据的容器。在Web中,Blob类型的对象表示不可变的类似文件对象的原始数据,通俗点说,就是Blob对象是二进制数据,但它是类似文件对象的二进制数据,因此可以像操作File对象一样操作Blob对象,实际上,File继承自Blob。
创建
blobParts:数组类型,数组中的每一项连接起来构成Blob对象的数据,数组中的每项元素可以是ArrayBuffer, ArrayBufferView, Blob, DOMString 。
options:可选项,字典格式类型,可以指定如下两个属性:
size代表Blob 对象中所包含数据的字节数。
slice方法
返回一个新的 Blob对象,包含了源 Blob对象中指定范围内的数据
使用场景
分片上传
因为File继承自Blob,因此我们可以调用slice方法对大文件进行分片长传:
Blob URL
Blob URL是blob协议的URL,它的格式如下:
Blob URL可以通过URL.createObjectURL(blob)创建。在绝大部分场景下,我们可以像使用Http协议的URL一样,使用Blob URL。常见的场景有:作为文件的下载地址和作为图片资源地址。
文件下载地址
点击下载按钮,浏览器将会下载一个名为file的文件,文件的内容是:Blob Data。通过Blob对象,我们在前端代码中就可以动态生成文件,提供给浏览器下载。
图片资源地址
为图片文件创建一个Blob URL,赋值给标签:
nput中选择的图片会在里显示出来。
该功能等同于使用Data URL加载图片资源:
FormData(用于模拟表单)
上传文件的格式一般是
传统的form表单上传
不过传统的form表单提交会导致页面刷新,但是很多情况下,我们不希望页面被刷新,这种时候我们都是使用Ajax的方式进行请求的。
formData()形式
如果是需要对多个文件同时上传,直接在fd后面继续append 文件即可,而不用另外new新的FormData实例:
同时axios等增大timeout:
特点
增加了ajax对二进制文件上传的支持:
获取或修改FormData方式
方案1:创建一个空的FormData对象,然后再用append方法逐个添加键值对:
方案2:取得form元素对象,将它作为参数传入FormData对象中!
方案3:利用form元素对象的getFormData方法生成它!
内置API方法
FormData.append
传给服务器的文件名称,当传入时,会作为value的文件名称。
atob、btoa: 用来处理解码和编码 base64 字符串
可以使用 window.btoa() 方法来编码一个可能在传输过程中出现问题的数据,并且在接受数据之后,使用 atob() 方法再将数据解码。例如:你可以编码、传输和解码操作各种字符,比如 0-31 的 ASCII 码值。
btoa
从 String 对象中创建一个 base-64 编码的 ASCII 字符串,其中字符串中的每个字符都被视为一个二进制数据字节。
atob
对经过 base-64 编码的字符串进行解码。
参考
细说Web API中的Blob
new FormData() 前端上传文件图片到服务器
The text was updated successfully, but these errors were encountered: