核心提示:移动端拍照上传功能简介此功能主要借助H5提供的新标签和新接口:input type=file new FormData拍照显示功能的实现调用系统默认的相机、相册、摄像机、录音功能function re...
移动端拍照上传功能简介
此功能主要借助H5提供的新标签和新接口:
input type=file new FormData
拍照显示功能的实现
调用系统默认的相机、相册、摄像机、录音功能
function readFile(input){
if(typeof FileReader == "undefined") {
alert("您的浏览器不支持HTML5的FileReader接口,请更换浏览器")
return
}
//这里是获取单张图片,如若获取多张,则为this.files
let fl = input.files[0]
//此处还可以获取文件类型和大小
let type = fl.type.split("/")[0]
if(type !== "image"){
alert("请上传图片")
return
}
let size = Math.round(fl.size/1024/1024)
if(size > 5){
alert("图片大小不得超过5M")
return
}
//初始化一个文件读取对象
let fr = new FileReader()
fr.onload = function(e){
//在这里做你想做的事情
$("img").attr("src", e.target.result)
}
fr.readAsDataURL(fl)
}
$("input").on("change", function(){
//调用上述函数
readFile(this)
})
FileReader对象介绍
readAsDataURL():将文件读取为base64的格式,作为图片的src
result属性: 将读取的数据保存在result中
progress事件:定时触发,可以获取当前已上传文件的大小,如进度条
load事件: 文件上传时触发
loadend事件: 文件上传完成时触发,不论文件上传是否成功都将触发
具体可参阅MDN上关于[FileReader的解释]
fr.onloadstart = function(){ console.log("start")}
fr.onprogress = function(e){
let tip = '已完成' + Math.round(e.loaded / e.total * 100) + '%'
$(".file-upload").find(".progress").text(tip)
console.log("uploading") //文件较大时会出现多个uploading
}
fr.onabort = function(){
console.log("cancel") //取消上传功能
}
fr.onerror = function(){
console.log("error")
}
fr.onload = function(){
console.log("complete")
}
文件上传功能的实现
此处上传功能的实现依赖于FormData, FormData是在XMLHttpRequest2级定义的,是为序列化表单以及创建与表单格式相同相同的数据提供便利。以下是其基本的使用方法:
构造函数
创建一个FormData对象实例:
var fd = new FormData();
添加数据
fd.append("file", fl)
fd.append("fileName", fl["name"])
向FormData中添加数据主要用到其append方法,当然还有其他方法,如get、getAll、delete、set、has,具体介绍见[FormData详解]
上传数据
$.ajax({
type: "post",
data: JSON.stringfy(fd),
url: "api/upload",
success: function(res){/* do something*/}
})
备注:如果你单纯的查看FormData对象的实例fd,那么你是查看不了的,直观感觉是一个空对象,你需要使用get或getAll方法查看


