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 可以使下面三个之一:

  1. 文件在操作系统中的路径
  2. DataURL 数据,用 Base64 编码,将二进制文件进行加密的过程,然后就可以使用这字符串来表示二进制文件了
  3. 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的更多相关文章

  1. HTML5的File API读取文件信息

    html结构: <div id="fileImage"></div> <input type="file" value=" ...

  2. 图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传

    一 . 背景及效果 当前互联网上传文件最多的就是图片文件了,但是传统web图片的截图上传需要:截图保存->选择路径->保存后再点击上传->选择路径->上传->插入. 图片 ...

  3. File API 读取文件小结

    简单地说,File API只规定怎样从硬盘上提取文件,然后交给在网页中运行的JavaScript代码. 与以往文件上传不一样,File API不是为了向服务器提交文件设计的. 关于File API不能 ...

  4. HTML5 File API — 让前端操作文件变的可能

    前言 在 HTML5 File API 出现之前,前端对于文件的操作是非常有局限性的,大多需要配合后端实现.出于安全角度考虑,从本地上传文件时,代码不可能获取文件在用户本地的地址,所以纯前端不可能完成 ...

  5. File API 读取上传的文件

    1, 在html 文档中,<input type="file"> 我们可以选择文件进行上传,但这时只能上传一个文件.如果加上multiple 属性,可以上传多个文件,上 ...

  6. Resumable.js – 基于 HTML5 File API 的文件上传

    Resumable.js 是一个 JavaScript 库,通过 HTML5 文件 API 提供,稳定和可恢复的批量上传功能.在上传大文件的时候通过每个文件分割成小块,每块在上传失败的时候,上传会不断 ...

  7. 使用 JavaScript File API 实现文件上传

    概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情.虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScr ...

  8. 通过Canvas及File API缩放并上传图片完整示例

    <!DOCTYPE html> <html> <head> <title>通过Canvas及File API缩放并上传图片</title> ...

  9. 【小月博客】用HTML5的File API做上传图片预览功能

    前段时间做了一个项目,涉及到上传本地图片以及预览的功能,正好之前了解过 html5(点击查看更多关于web前端的有关资源) 可以上传本地图片,然后再网上看了一些demo结合自己的需求,终于搞定了.(P ...

  10. [Node.js] 使用File API 异步上传文件

    原文地址:http://www.moye.me/2014/11/05/html5-filereader/ 最近在做一个网盘的项目,不出意外的涉及到大文件的上传,那么问题来了:如何实时的显示文件上传的进 ...

随机推荐

  1. 写个OAuth2.0的请求端来测试自己的OAuth2.0服务端(二)

    在上一篇文章中,我们介绍了怎么创建自己的服务器,现在我们开始写个client端,来测试. 我们创建一个MVC项目,叫TestOAuthClient 1. 代码开始 1)第一步,我们创建一个MainCo ...

  2. Spring基础(6) : 普通Bean对象中保存ApplicationContext

    public class Person implements ApplicationContextAware{ ApplicationContext context; public String na ...

  3. echart 数据视图 样式重写

    来源http://blog.csdn.net/u010705091/article/details/75212724 echarts折线图的数据视图样式重写 在echarts.js中,点击折线图的数据 ...

  4. [javaSE] 看知乎学习反射

    简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 知乎:学习java应该如何理解反射?   余晖: 反射提供了一种运 ...

  5. 【公众号转载】超详细 Nginx 极简教程,傻瓜一看也会!

    什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...

  6. Android - 内存泄漏 + 垃圾回收(GC)概念

    Android内存泄露——全解析和处理办法 内存泄露 说到内存泄露,就不得不提到内存溢出,这两个比较容易混淆的概念,我们来分析一下. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未 ...

  7. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

  8. Python面试题都在这里了

    转自武沛齐博客:http://www.cnblog.com/wupeiqi/ 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java ...

  9. Javascript 随机数函数 学习之二:产生服从正态分布随机数

    一.为什么需要服从正态分布的随机函数 一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实 ...

  10. vue-router重定向 不刷新问题

    前阵子太忙了,自己一个人一边开发着新项目,一边维护着旧项目,没时间写博客,终于让我腾出时间了.废话少说,开始正文. 问题描述: 之前项目是angular开发的,后来用vue重构后.项目路径和vue路径 ...