记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能。当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了其他方式来实现了这个功能。

  今天无意发现了一个知识点,用html的file标签就能实现图片上传前预览,感觉很棒,记录一下!就是通过file标签和js的FileReader接口,把选择的图片文件调用readAsDataURL方法,把图片数据转成base64字符串形式显示在页面上。

1、闲话少说,测试一下,图片上传前预览(选择图片):

 

实现代码:

<div style="border:2px dashed red;">
<p>
图片上传前预览:<input type="file" id="xdaTanFileImg" onchange="xmTanUploadImg(this)" accept="image/*"/>
<input type="button" value="隐藏图片" onclick="document.getElementById('xmTanImg').style.display = 'none';"/>
<input type="button" value="显示图片" onclick="document.getElementById('xmTanImg').style.display = 'block';"/>
</p>
<img id="xmTanImg"/>
<div id="xmTanDiv"></div>
</div>
<hr />
<script type="text/javascript">
//判断浏览器是否支持FileReader接口
if (typeof FileReader == 'undefined') {
document.getElementById("xmTanDiv").InnerHTML = "<h1>当前浏览器不支持FileReader接口</h1>";
//使选择控件不可操作
document.getElementById("xdaTanFileImg").setAttribute("disabled", "disabled");
} //选择图片,马上预览
function xmTanUploadImg(obj) {
var file = obj.files[0]; console.log(obj);console.log(file);
console.log("file.size = " + file.size); //file.size 单位为byte var reader = new FileReader(); //读取文件过程方法
reader.onloadstart = function (e) {
console.log("开始读取....");
}
reader.onprogress = function (e) {
console.log("正在读取中....");
}
reader.onabort = function (e) {
console.log("中断读取....");
}
reader.onerror = function (e) {
console.log("读取异常....");
}
reader.onload = function (e) {
console.log("成功读取...."); var img = document.getElementById("xmTanImg");
img.src = e.target.result;
//或者 img.src = this.result; //e.target == this
} reader.readAsDataURL(file)
}
</script>

-------------------------------  end  -----------------------------

2、另外 FileReader除了有函数readAsDataURL,另外还有另外两个函数readAsBinaryString 和 readAsText,分别可以将选择的文件读取成二进制和文本格式

测试一下,选择文本(txt、cs、html、js、css、xml),读取成二进制或者文本:

选择文件:

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Web; /// /// 包含MD5加密,DES加密解密 /// public class Secret { //DES8位秘钥 private const string desKey = "xlkxlk33"; #region DES加密 解密 /// /// DES加密字符串 /// ///待加密的字符串 ///加密密钥,要求为8位 ///加密成功返回加密后的字符串,失败返回源串 public static string EncryptDES(string encryptString) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(desKey); byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString); DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Convert.ToBase64String(mStream.ToArray()); } catch { return encryptString; } } /// /// DES解密字符串 /// ///待解密的字符串 ///解密密钥,要求8位 /// public static string DecryptDES(string decryptString) { try { //默认密钥向量 byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; byte[] rgbKey = Encoding.UTF8.GetBytes(desKey); byte[] rgbIV = Keys; byte[] inputByteArray = Convert.FromBase64String(decryptString); DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); MemoryStream mStream = new MemoryStream(); CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length); cStream.FlushFinalBlock(); return Encoding.UTF8.GetString(mStream.ToArray()); } catch { return decryptString; } } #endregion #region MD5加密 /// /// MD5加密 /// ////// public static string MD5(string s) { var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); var result = ""; if (!string.IsNullOrWhiteSpace(s)) { result = BitConverter.ToString(md5.ComputeHash(UnicodeEncoding.UTF8.GetBytes(s.Trim()))); } return result; } #endregion }

实现代码:

<script type="text/javascript">
//判断浏览器是否支持FileReader接口
if (typeof FileReader == 'undefined') {
document.getElementById("xmTanContentDiv").InnerHTML = "<p>当前浏览器不支持FileReader接口!</p>";
document.getElementById("xmTanFile").setAttribute("disabled", "disabled");
} //选择文件
function xmTanUploadFile(obj){
if (obj.files.length < 1) return; var file = obj.files[0]; if (file.size > 1024 * 1024) {
alert("文件大于1M, 太大了,小点吧!");
obj.value = "";
return;
}
} //读取文件为二进制
function readAsBinaryString() {
var obj = document.getElementById("xmTanFile");
if (obj.files.length < 1) return; var file = obj.files[0];
var reader = new FileReader(); //将文件以二进制形式读入页面
reader.readAsBinaryString(file);
reader.onload = function (f) {
document.getElementById("xmTanContentDiv").innerHTML = this.result;
}
} //读取文件为文本
function readAsText() {
var obj = document.getElementById("xmTanFile");
if (obj.files.length < 1) return; var file = obj.files[0];
var reader = new FileReader(); //将文件以文本形式读入页面
reader.readAsText(file);
reader.onload = function (f) {
document.getElementById("xmTanContentDiv").innerHTML = this.result;
}
}
</script>
<div style="border: 2px dashed red; padding: 20px 0px;">
<label>选择文件:</label>
<input type="file" id="xmTanFile" accept=".html,.js,.css,.txt,.cs,.xml" onchange="xmTanUploadFile(this)"/>
<input type="button" value="读取成二进制数据" onclick="readAsBinaryString()" />
<input type="button" value="读取成文本数据" onclick="readAsText()" />
<input type="button" value="隐藏读取内容" onclick="document.getElementById('xmTanContentDiv').style.display = 'none';"/>
<input type="button" value="显示读取内容" onclick="document.getElementById('xmTanContentDiv').style.display = 'block';"/>
<div id="xmTanContentDiv"></div>
</div>

---------------------------

3、----------- a标签之download属性 -------------

   设置a标签href为图片链接,再设置download属性,点此链接可以直接下载图片

  

点此下载

实现代码:

<div style="text-align:center; padding: 5px 20px;width: 70%;">
<img id="xmTanShowImg" src=""/>
<h1><a href="javascript:void()" download="girl.jpg" id="xmTanDownload">点此下载</a></h1>
</div>
<script type="text/javascript">
//图片转成base64位字符串数据
var imgData = "data:image/png;base64,.........";
//或直接设置图片链接: var imgData = "images/picture.png"; document.getElementById("xmTanShowImg").setAttribute("src", imgData); //给图片标签设置src
document.getElementById("xmTanDownload").setAttribute("href", imgData); //给a标签设置href
</script>

原文链接:http://www.cnblogs.com/tandaxia/p/5125275.html

【转】html之file标签 --- 图片上传前预览 -- FileReader的更多相关文章

  1. html之file标签 --- 图片上传前预览 -- FileReader

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  2. file标签 - 图片上传前预览 - FileReader & 网络图片转base64和文件流

    记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能.当时用html的<input type="file"/>标签一直实现不了,最后舍弃了这个标签,使用了 ...

  3. input file实现多选,限制文件上传类型,图片上传前预览功能

    限制上传类型 & 多选:① accept 属性只能与 <input type="file" /> 配合使用.它规定能够通过文件上传进行提交的文件类型. ② mu ...

  4. ASP.NET MVC图片上传前预览

    回老家过春节,大半个月,在家的日子里,吃好睡好,人也长了3.5Kg.没有电脑,没有网络,无需写代码,工作上相关的完全放下......开心与父母妻儿过个年,那样的生活令Insus.NET现在还在留恋.. ...

  5. 【转】HTML5 jQuery图片上传前预览

    hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images,本例子主要是使用HTML5 的File API,建立一個可存取到该 file的url,一个空的img标签,ID为img0,把选 ...

  6. HTML5 jQuery图片上传前预览

    hTML5实现表单内的上传文件框,上传前预览图片,针刷新预览images,本例子主要是使用HTML5 的File API,建立一個可存取到该file的url,一个空的img标签,ID为img0,把选择 ...

  7. input type=file实现图片上传,预览以及图片删除

    背景 前两天在做一个PC网站的意见反馈,其中涉及到了图片上传功能,要求可以上传多张图片,并且支持图片上传预览及图片删除, 图片上传这一块以前没怎么搞过,而且一般也很少会碰到这样的需求,所以在做这个功能 ...

  8. HTML5 FileReader实现图片上传前预览

    如果你的浏览器支持Html5的FileReader的话,实现图片上传前进行预览是一件非常容易之事情. 在控制器,创建一个视图Action: jQuery代码: 实时演示一下: 下面内容于2014-11 ...

  9. 图片上传前预览、压缩、转blob、转formData等操作

    直接上代码吧: <template> <div> <div class="header">添加淘宝买号</div> <div ...

随机推荐

  1. django头像上传详解

    使用form组件上传头像 实现的效果如下: 将默认的上传文件框隐藏起来变成了一个默认的头像 而且可以点击上传 处理步骤 avatar = forms.FileField( widget = widge ...

  2. Struts2_day01--Struts2的核心配置文件_常量配置_分模块开发_Action编写方式

    Struts2的核心配置文件 1 名称和位置固定的 2 在配置文件中主要三个标签 package.action.result,标签里面的属性 标签package 1 类似于代码包,区别不同的actio ...

  3. 剑指 offer set 17 判断一棵树是否是平衡树

    总结 1. 书上给出一个简洁代码, 说是会重复遍历. 2. 框架相同, 可以写出下面的代码 class Solution { public: bool ans; int getHeight(TreeN ...

  4. configChanges

    android中的组件Activity在manifest.xml文件中可以指定参数android:ConfigChanges,用于捕获手机状态的改变. 在Activity中添加了android:con ...

  5. 基于java 的websocket的聊天功能,一开始初始化websocket,执行打开连接之后就直接关闭连接了。

    1 错误描述: java 后台没有报错,但是就是连接不上,一连上又自动关闭. 2 错误根源: 缺少jar包. 对比了报错的tomcat 的jar包和不报错的jar包 发现是tomcat下缺少上图绿色框 ...

  6. poj_3159 最短路

    题目大意 有N个孩子(N<=3000)分糖果.有M个关系(M<=150,000).每个关系形如:A B C 表示第B个学生比第A个学生多分到的糖果数目,不能超过C.求第N个学生最多比第1个 ...

  7. 动态规划——最长公共子序列&&最长公共子串

      最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...

  8. 【BZOJ3033】太鼓达人 暴力+欧拉回路

    [BZOJ3033]太鼓达人 Description 七夕祭上,Vani牵着cl的手,在明亮的灯光和欢乐的气氛中愉快地穿行.这时,在前面忽然出现了一台太鼓达人机台,而在机台前坐着的是刚刚被精英队伍成员 ...

  9. chrome不支持字体12px

    如果网页字体小于12px的话,人眼看着会不太舒服,所以chrome的最小字体为12px. 如果想要缩小字体,可以尝试用CSS3中的 transform: scale(相应的缩小倍数)来实现. 不过不推 ...

  10. Python--比较两个字典部分value是否相等

    # 比较两个字典部分是否相等def compare_two_dict(dict1, dict2, key_list): flag = True keys1 = dict1.keys() keys2 = ...