File API
ES5 推出了一系列的 API:
- BLOB (二进制大对象)
- File (文件接口,基于 BLOB,但是增加了文件相关的方法,比如路径,大小)
- FileList (借助 <input type="file">,来获取硬盘文件的一个接口)
- FileReader
- URL
1 Simple APIs
// 第一步,获取 input
var fileInput = document.getElementById("myfile"); // 第二步,通过 input 获取 FileList
var fileList = fileInput.files; // 第三步,通过 FileList 获取某个文件的对象
var file = fileList[]; // 简单来说,获取 File 对象就是:
file = document.getElementById('myfile').files[];
一个图片 <img src="" > 的 src 可以使下面三个之一:
- 文件在操作系统中的路径
- DataURL 数据,用 Base64 编码,将二进制文件进行加密的过程,然后就可以使用这字符串来表示二进制文件了
- ObjectURL,它是我们需要使用的文件的一个引用字符串而已,格式为
blob:http://localhsot:8080/a3b05b0e-bd18-4b53-b6b8-0b345e9aebdb
2 Preview Demo
使用 ObjectURL:
myfile.onchange = function () {
var imgUrl = URL.createObjectURL(myfile.files[]);
myimg.src = imgUrl;
myimg.onload = () => URL.revokeObjectURL(imgUrl);
};
3 Compress and Upload with AJAX
function shangchuantupian() {
// 1. 获取图片的数据
// 2. 校验大小,如果超过尺寸,那么对其进行压缩
// 3. 加上你的水印
// 4. 调用 ajax 方式,将其发送到服务器
var canvas = document.createElement("canvas");
var image = new Image();
var imgUrl = URL.createObjectURL(myfile.files[]);
image.src = imgUrl;
image.onload = () => {
URL.revokeObjectURL(imgUrl);
canvas.width = image.width / ;
canvas.height = image.height / ;
var ctx = canvas.getContext('2d');
ctx.drawImage(image, , , image.width / , image.height / );
ctx.fillText("nf147", image.width / - , image.height / - );
canvas.toBlob(function (b) {
var fd = new FormData();
fd.append("fff", b);
fetch("/myupload", {
method: 'post',
body: fd
}).then(resp => resp.body);
}, "image/jpeg");
};
}
4 Compress and Upload [version 2]
HTML:
<style>
#myimg {
border: 3px solid gray;
border-radius: 5px;
position: absolute;
top: ;
left: ;
} #mymask {
position: absolute;
top: ;
left: ;
}
</style> <div class="container">
<div style="margin-top: 2em;">
<input type="file" id="myfile" style="display: none"> <!-- 选择文件后,要预览 -->
<button class="btn btn-primary" onclick="myfile.click()">选择图片</button>
<button class="btn btn-primary" onclick="clickMe()">上传图片</button>
</div> <div style="position: relative">
<img src="" id="myimg" title="暂时没有上传" width="" height=""/>
<canvas id="mymask" width="" height="">不支持canvas</canvas>
</div>
</div>
JS:
var ctx;
myfile.onchange = () => { // 预览图片
var imgUrl = URL.createObjectURL(event.target.files[]);
myimg.src = imgUrl;
myimg.onload = () => URL.revokeObjectURL(imgUrl);
};
function clickMe() {
compressImgWithCanvas(myfile.files[], uploadWithAJAX);
// uploadWithAJAX(myfile.files[0]);
}
/**
* 压缩图片,然后执行某些任务
*/
function compressImgWithCanvas(blob, taskCallback) {
console.log("bbb");
var rat = ;
var w = myimg.naturalWidth / rat, h = myimg.naturalHeight / rat;
var canvas = document.createElement("canvas");
canvas.width = w;
canvas.height = h;
var ctx = canvas.getContext('2d');
ctx.drawImage(myimg, , , w, h);
ctx.fillText("nf147", w - , h - );
canvas.toBlob(taskCallback, "image/jpeg");
}
/**
* 更新预览进度
*/
function refreshProgress(r) {
if (!ctx) ctx = mymask.getContext('2d');
ctx.save();
ctx.clearRect(, , , );
ctx.globalAlpha = 0.6;
ctx.fillRect(, ( - r) * , , );
ctx.globalAlpha = ;
ctx.fillStyle = "white";
ctx.font = "20px 微软雅黑";
ctx.fillText(r * + '%', , );
ctx.restore();
}
/**
* 通过 AJAX 上传 blob 类型的文件
* @param blob
*/
function uploadWithAJAX(blob) {
var fd = new FormData();
fd.append("fff", blob);
$.ajax({
method: 'post',
url: "/myupload",
cache: false,
contentType: false,
data: fd,
processData: false,
xhr: () => {
var xhr = $.ajaxSettings.xhr();
xhr.upload.onprogress = (ev) => {
refreshProgress(ev.loaded / ev.total);
};
return xhr;
}
}).done(console.log)
.fail((xhr, staus, err) => console.error(xhr, staus, err));
}
File API的更多相关文章
- HTML5的File API读取文件信息
html结构: <div id="fileImage"></div> <input type="file" value=" ...
- 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...
- File API 读取文件小结
简单地说,File API只规定怎样从硬盘上提取文件,然后交给在网页中运行的JavaScript代码. 与以往文件上传不一样,File API不是为了向服务器提交文件设计的. 关于File API不能 ...
- HTML5 File API — 让前端操作文件变的可能
前言 在 HTML5 File API 出现之前,前端对于文件的操作是非常有局限性的,大多需要配合后端实现.出于安全角度考虑,从本地上传文件时,代码不可能获取文件在用户本地的地址,所以纯前端不可能完成 ...
- File API 读取上传的文件
1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...
- Resumable.js – 基于 HTML5 File API 的文件上传
Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...
- 使用 JavaScript File API 实现文件上传
概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScr ...
- 通过Canvas及File API缩放并上传图片完整示例
<!DOCTYPE html> <html> <head> <title>通过Canvas及File API缩放并上传图片</title> ...
- 【小月博客】用HTML5的File API做上传图片预览功能
前段时间做了一个项目,涉及到上传本地图片以及预览的功能,正好之前了解过 html5(点击查看更多关于web前端的有关资源) 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(P ...
- [Node.js] 使用File API 异步上传文件
原文地址:http://www.moye.me/2014/11/05/html5-filereader/ 最近在做一个网盘的项目,不出意外的涉及到大文件的上传,那么问题来了:如何实时的显示文件上传的进 ...
随机推荐
- POJ 2771 Guardian of Decency(最大独立集数=顶点数-最大匹配数)
题目链接: http://poj.org/problem?id=2771 Description Frank N. Stein is a very conservative high-school t ...
- jQuery找到GridView控件ItemTemplate模版内的控件
可以使用下面的方法,jQuery找到GridView控件ItemTemplate模版内的CheckBox: 使用jQuery的find()方法:
- 6.C#知识点:反射
1.反射是什么? 反射提供描述组件,模块和类型的对象(类型为Type).您可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型,并调用其方法或访问其字段和属性.如果您在代码中使 ...
- [android] WebView与Js交互
获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置j ...
- Java基础——Servlet(六)分页相关
前面写了Servlet(一)到(五),主要是在网上搜罗的视频.对分页这块还是不太清楚.于是有找到一些视频,重新学习了一下.主要是对分页的认识和设计思路.也是为了方便我以后回忆一下.. 一.分页常识 p ...
- mysql建表以及列属性
一.整型( int, tinyint, smallint 等 ) ------------------------------------------------------------------- ...
- linux系统编程:获取glibc的版本号
我的环境是ubuntu16.04 glibc官网:http://www.gnu.org/software/libc/libc.html 方法一.一般来说,涉及到库调用的程序,在链接时候都会链接到gli ...
- js-权威指南学习笔记19
第十九章 jQuery类库 1.传递HTML文本字符串给$()方法,jQuery会根据传入的文本创建好HTML元素并封装为jQuery对象返回. 2.想要遍历jQuery对象中的所有元素时,可以调用e ...
- 百度自动推送js
<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...
- Zookeeper简单初应用
一.Zookeeper 1.1 概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务 ...