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/ 最近在做一个网盘的项目,不出意外的涉及到大文件的上传,那么问题来了:如何实时的显示文件上传的进 ...
随机推荐
- 如何判断JavaScript数据具体类型
昨晚做了阿里的题目,让我写一个函数,可以判断数据的具体类型.其实题目很简单的...但是真的是自己不太注意吧,写的很糟糕啊. 然后今天就自己写了一个,然后又到晚上搜了下,看看别人的写法,结果发现自己有点 ...
- 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序
显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...
- .37-浅析webpack源码之事件流make(4)
赶紧完结这个系列咯,webpack4都已经出正式版了. 之前的代码搜索到js文件的对应loader,并添加到了对象中返回,流程如下: this.plugin("factory", ...
- XML Parsing Error: no element found Location: moz-nullprincipal:{23686e7a-652b-4348-92f4-7fb3575179ed} Line Number 1, Column 1:^
“Hi Insus.NET, 我有参考你下午发布的一篇<jQuery.Ajax()执行WCF Service的方法>http://www.cnblogs.com/insus/p/37278 ...
- WPF备忘录(1)有笑脸,有Popup
1.画个笑脸给大家娱乐一下: <Canvas Width="200" Height="180" VerticalAlignment="Cente ...
- JS去掉字符串前后空格或去掉所有空格的用法
1. 去掉字符串前后所有空格: 代码如下: function Trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } 说明 ...
- swagger2的使用
springboot项目里怎么使用swagger2? 1.maven依赖 <dependency> <groupId>io.springfox</groupId> ...
- 【Java并发编程】4、JDK7中TransferQueue的使用以及TransferQueue与SynchronousQueue的差别
转自:http://blog.csdn.net/aitangyong/article/details/46472643 JDK7对JDK5中的J.U.C并发工具进行了增强,其中之一就是新增了Trans ...
- Graveyard(poj3154)
Graveyard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1289 Accepted: 660 Specia ...
- EF CodeFirst(三) 并发处理
并发分为两种,一种叫做悲观并发,一种叫乐观并发. 名字挺文艺 悲观并发 悲观并发是什么呢? 就拿我们常用的代码版本控制来说. 有一个文档,A和B都要 获取这个文档并进行修改, 如果当A在读取这个文档数 ...