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. zoj Beautiful Number(打表)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2829 题目描述: Mike is very lucky, as ...

  2. 基于GoogLeNet的不同花分类微调训练案例

    import tensorflow as tf from tensorflow.contrib.slim import nets slim = tf.contrib.slim import numpy ...

  3. .8-浅析express源码之请求处理流程(1)

    这一节就讲从一个请求到来,express内部是如何将其转交给合适的路由,路由又是如何调用中间件的. 以express-generator为例,关键代码如下: // app.js app.use('/' ...

  4. MSSQL如何将查询结果拼接成字符串

    在博问上看到一个提问“MSSQL如何将查询结果拼接成字符串” ,想了一下应该怎么实现呢,在c#等语言下好实现,但在sql里实现.还真没做过. 目标:想要在SQL中将查询的结果拼接为 '1','2',' ...

  5. echart 数据视图 样式重写

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

  6. MYSQL查询优化:数据类型与效率

    这一部分提供了如何选择数据类型来帮助提高查询运行速度的一些指导:    在可以使用短数据列的时候就不要用长的.如果你有一个固定 长度的CHAR数据列,那么就不要让它的长度超出实际需要.如果你在数据列中 ...

  7. SpringIOC的小例子

    IOC IOC--Inversion of Control即控制反转,常常和DI--依赖注入一起被提到. 核心是为了解除程序之间的耦合度. 那么什么样的代码是耦合度高的呢? 假如有个人现在去买苹果 i ...

  8. node 搭建静态服务

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解. 基本功能 不急着写下第一行代码,而是先梳理一下就基本功能而言有哪 ...

  9. (1-2)line-height的各类属性值

    (1-2)line-height的各类属性值 首先来个疑问!没有问题印象不深嘛 一.line-height支持哪些属性值呢? 五只手指头就能数过来了咯. 比如normal, <number> ...

  10. Android Studio离线打包5+SDK

    dcloud官网下载最新版5+SDK 解压后,Android Studio导入HBuilder-Hello,选择From eclispe 修改assets/data/dcloud_control.xm ...