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. DispatcherServlet源码注解分析

    DispatcherServlet的介绍与工作流程 DispatcherServlet是SpringMVC的前端分发控制器,用于处理客户端请求,然后交给对应的handler进行处理,返回对应的模型和视 ...

  2. 122. 买卖股票的最佳时机 II

    题意描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易( ...

  3. 未能找到路径E:\项目文件\W\vbc.exe”的一部分

    网上找的说要引用Microsoft.CodeDom.Providers.DotNetCompilerPlatform, 我已经引用了,是差roslyn文件夹,从别的项目考一份过来就好了

  4. C# 导出Excel表格

    function exportExcel() { //查询条件 var startTime = F.ui.startTime.getText() == "" ? null : F. ...

  5. JAVA项目工具包集合

    本文包括工具的下载以及配置,持续更新中…… 1 JDK 官网:https://www.oracle.com 下载:https://www.oracle.com/technetwork/java/jav ...

  6. 233 Matrix(hdu5015 矩阵)

    233 Matrix Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. XJad反编译工具

    XJad反编译工具 我们写的java文件,编译后就会生成相应的字节码文件,也就是.java文件经过编译以后生成.class文件 现在,假设我们现在存在这样一个问题:就是我们想自己动手验证注释会不会被编 ...

  8. 如何在idea中设置Tomcat虚拟路径

    设置项目的根路径: 设置指定文件的在Tomcat中的虚拟路径: 代码: String fileName = MyFileUtil.getFileName(uploadFileName); File f ...

  9. BCB 读写Word文档

    void __fastcall TForm1::btn1Click(TObject *Sender) { Variant WordApp,WordDocs,WordDoc; Variant word_ ...

  10. php魔术方法__tostring的应用

    当echo一个对象的时候,会报错误 Object of class Person could not be converted to string 我们可以通过魔术方法__tostring()  把对 ...