js操作文件

 

在HTML表单中,可以上传文件的唯一控件就是<input type="file">。

注意:当一个表单中包含<input type="file">时,表单的enctype必须指定 为multipart/form-data,method必须指定为post,浏览器才能正确并以multipart/form-data格式发送表单的数据。

出于安全考虑,浏览器只允许用户点击<input type="file">来选择本地文件,用JavaScript对<input type="file">的value赋值是没有任何效果的。当用户选择了上传某个文件后,JavaScript也无法获得该文件的真实路径:

<!Doctype html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript</title>
</head>
<body>
<input type="file" enctype="multipart/form-data" method="post">
</body>
</html>

 

结果:

通常上传文件都由后台服务器处理,JavaScript可以在提交表单时对文件扩展名做检查,以便防止用户上传无效格式的文件:

var f = document.getElementById('test-file-upload');
var filename = f.value; // 'C:\fakepath\test.png'
if (!filename || !(filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.gif'))) {alert('Can only upload image file.');return false;
}

 

File API

由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。

随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。

HTML5的File API提供了File和FileReader两个主要对象,可以获得文件信息并读取文件。

我们来看一个例子,如何读取用户选取的图片文件,并在一个<div>中预览图像:

 

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>文件api</title>
<style>#test-image-preview {width:500px;height:500px;border:1px solid #ff0000;}
</style>
<script src="/static/js/api.js"></script>
</head>
<body><div id="test-file-info"></div><div id="test-image-preview"></div><form action=""><input id="test-image-file" type="file" enctype="multipart/form-data" method="POST"></form>
</body>
</html>

 

 

图片预览:

varfileInput = document.getElementById('test-image-file'),info = document.getElementById('test-file-info'),preview = document.getElementById('test-image-preview');
// 监听change事件:
fileInput.addEventListener('change', function () {// 清除背景图片:preview.style.backgroundImage = '';// 检查文件是否选择:if (!fileInput.value) {info.innerHTML = '没有选择文件';return;}// 获取File引用:var file = fileInput.files[0];// 获取File信息:info.innerHTML = '文件: ' + file.name + '<br>' +'大小: ' + file.size + '<br>' +'修改: ' + file.lastModifiedDate;if (file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'image/gif') {alert('不是有效的图片文件!');return;}// 读取文件:var reader = new FileReader();reader.onload = function(e) {vardata = e.target.result; // 'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...'            preview.style.backgroundImage = 'url(' + data + ')';};// 以DataURL的形式读取文件:
    reader.readAsDataURL(file);
});

上面的代码演示了如何通过HTML5的File API读取文件内容。以DataURL的形式读取到的文件是一个字符串,类似于data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...,常用于设置图像。如果需要服务器端处理,把字符串base64,后面的字符发送给服务器并用Base64解码就可以得到原始文件的二进制内容。

回调

上面的代码还演示了JavaScript的一个重要的特性就是单线程执行模式。在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行,也就是说,任何时候,JavaScript代码都不可能同时有多于1个线程在执行。

你可能会问,单线程模式执行的JavaScript,如何处理多任务?

在JavaScript中,执行多任务实际上都是异步调用,比如上面的代码:

reader.readAsDataURL(file);

 

就会发起一个异步操作来读取文件内容。因为是异步操作,所以我们在JavaScript代码中就不知道什么时候操作结束,因此需要先设置一个回调函数:

reader.onload = function(e) {// 当文件读取完成后,自动调用此函数:
};

当文件读取完成后,JavaScript引擎将自动调用我们设置的回调函数。执行回调函数时,文件已经读取完毕,所以我们可以在回调函数内部安全地获得文件内容。

(该篇还需细读)

 

 

转载于:https://www.cnblogs.com/ocean-boy/p/7389220.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript读取本地图片到浏览器

代码: <html> <head> <script type="text/javascript"> function getFileUrl(sourceId) { var url; if (navigator.userAgent.indexOf("MSIE")>=1) { // IE url = document.getElementById(sourceId).value; } else if(navigator.…

Web程序员的Mysql进阶序二之sql多条数据插入、多条数据更新、多表同时查询

数据库在web开发的时候&#xff0c;减少连接次数可以降低数据库负载&#xff0c;所以一次连接&#xff0c;多数据操作可以有效的优化数据库。 假设表结构如下&#xff1a; create table test(name varchar(10),sex varchar(10) ); create table test1(name varchar(10),sex v…

Android封装快捷键,android打包一个没有快捷键的apk,并且通过另一个应用启动

1.有时候我们的需求是每个功能可能类似一个插件那样分开&#xff0c;需要我们分别不同开发2.首先我们如何安装apk之后不显示Lanch呢&#xff1f;android:name".app.Books.Books"android:configChanges"orientation|keyboardHidden|screenSize|smallestScreenSiz…

MVC 扩展方法特点

.NET MVC 3中扩展方法特点&#xff1a; &#xff08;1&#xff09;扩展类的名称以Extensions结尾&#xff1b; &#xff08;2&#xff09;扩展类的类型是static&#xff1b; &#xff08;3&#xff09;扩展方法至少有一个参数&#xff0c;第一个参数必须指定该方法作用于哪个类…

C# Linq源码解析之Aggregate

前言在Dotnet开发过程中&#xff0c;Aggregate作为IEnumerable的扩展方法&#xff0c;十分常用。本文对Aggregate方法的关键源码进行简要分析&#xff0c;以方便大家日后更好的使用该方法。使用Aggregate是对序列应用累加器的函数。看下面一段代码:List<string> lst new…

c语言输出中文为乱码_C语言编程出现汉字输出乱码现象

匿名用户1级2014-06-27 回答//因为不知道你具体的功能流程&#xff0c;所以我只能先就语法来提下代码的问题int cha(){//int a[N],b[N];//int i0,x,v1,v2;char a[N][M] {0};//M为字符串最大长度加1,根据要求设置int b[N] {0};int i0,x,v2;char v1[M] {0};FILE *f;if((ffopen…

剑指offer之二叉树的高度

1 问题 求二叉树的深度&#xff0c;比如下面的二叉树&#xff0c;高度是4 22 13 3 2 53 2 代码实现 int getTreeHeigh(Node *haed) {if (head NULLL){return 0;}int left getTreeHeigh(head->left);int right getTreeHeigh(head->right);retur…

Entity Framework Code First模式基础知识及入门实例01

在深入学习某项技术之前,应该努力形成对此技术的总体印象,并了解其基本原理,本文的目的就在于此。 一、理解EF数据模型 EF本质上是一个ORM框架,它需要把对象映射到底层数据库中的表,为此,它使用了三个模型来描述这种映射关系。 (1)概念模型(Conceptual Model):主要…

mycat 双主 热切换

为什么80%的码农都做不了架构师&#xff1f;>>> Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz schema.xml <?xml version"1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat"ht…

Web程序员的Mysql进阶序三之sql多表数据删除、子查询、联合查询

假设表结构如下&#xff1a; create table test(name varchar(10),sex varchar(10) ); create table test1(name varchar(10),sex varchar(10) );假设多条数据同时插入&#xff1a; insert into test (name,sex) values(xiao,nan),(xiao1,nan1),(xiao2,nan2); insert into te…

android 传感器 balance filter,Android 传感器 API.doc

Android 传感器 API1.1 序言 ? ?【Android蛋蛋网】在这一章我们主要针对Android的传感器(Sensor)进行说明。如果说Java的程序和硬件有些远的感觉&#xff0c;那么可以说传感器距离硬件很近。传感器(Sensor)听起来似乎感觉很难&#xff0c;其实它并不是很难。做起来并很有意思…

6 四大组件之Service

6-1 Servie概述 组件篇——Service 定义:  1.后台运行,不可见,没有界面  2.优先级高于Activity Service是Android系统的后台服务组件&#xff0c;适用于开发无界面、长时间运行的应用功能。 Service特点如下&#xff1a; 没有用户界面 不会轻易被Android系统终止 在系统…

WCF服务寄宿IIS时.SVC文件无法浏览的解决办法

在IIS中托管服务和经典的ASMX Web服务托管相似,需要在IIS下创建虚拟目录,并提供一个.svc文件和Web.config配置文件。另外,托管时,服务的基地址必须与.svc文件的地址相同。 一、操作步骤: (1)打开IIS,新建网站,选择物理路径 (2)打开IIS,在默认网站下添加应用程序,…

python自动生成鸡汤文_用20行Python代码生成鸡汤,打造AI咪蒙指日可待。

作者&#xff1a;Ramtin Alami“Don’t think of the overwhelming majority of the impossible.” “不要去想不可能之事” “Grew up your bliss and the world.” “努力赢得自己的幸福和世界” “what we would end create, creates the ground and you are the one to war…

他毕业两年,博客一年,时间

这是2014年10个月。时光匆匆&#xff0c;看到该公司的新鲜新的一年。有时&#xff0c;一个想法。其实&#xff0c;我在这个城市工作了两年多&#xff0c;总是觉得自己老了。从一般再聘请两名现在厂家机构和学校&#xff0c;懵懵懂懂从校园到完成社区&#xff0c;来写个总结&…

linux shell之替换目录下包含关键字所有文本里面的内容

1 问题 替换目录下包含关键字所有文本里面的内容 比如在目录 /root/chenyu/cy/下&#xff0c;把包含文本/A/B C替换成文本EF 2 解决办法 命令如下 grep -Rl /A/B\ C /root/chenyu/c* | xargs sed -i s#/A/B\ C#EF#g 我们也可以这样 grep -Rl /A/B\ C /root/chenyu/c/ | x…

C#语法糖系列 —— 第一篇:聊聊 params 参数底层玩法

首先说说为什么要写这个系列&#xff0c;大概有两点原因。这种文章阅读量确实高...对 IL 和 汇编代码 的学习巩固所以就决定写一下这个系列&#xff0c;如果大家能从中有所收获&#xff0c;那就更好啦&#xff01;一&#xff1a;params 应用层玩法 首先上一段 测试代码。class …

nginx 修改配置文件使之支持pathinfo,且隐藏index.php

声明环境&#xff1a; nginx centos6.8 使用lnmp一键包搭建环境&#xff08;2019年2月19日 &#xff09;以前使用过别的办法去修改配置文件&#xff0c;但是过于繁琐&#xff0c;最近发现新版本中&#xff0c;在nginx 的 conf目录下发现了文件“enable-php-pathinfo.conf”&am…

Android开发经典笔试面试题汇总(持续更新中)

1.我们都知道Handler是线程与Activity通信的桥梁&#xff0c;假设线程处理不当。你的机器就会变得非常慢&#xff0c;那么线程销毁的方法是&#xff1a;&#xff08;A&#xff09;A. onDestroy()B. onClear()C. onFinish()D. onStop()理解&#xff1a;正确销毁线程的方法应该是…

WCF服务自托管(Self-Hosting)

WCF寄宿方式是一种非常灵活的操作,可以寄宿在各种进程之中,常见的寄宿有:IIS服务、Windows服务、Winform程序、控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便、高效提供服务调用。 当客户端和服务端之间的进程有明确的边界时,使用自托管,需要注意的…