js实现图片上传预览原理

现在网上有很多成熟的图片上传的插件,由于之前对于图片上传未接触过,不了解其实现原理。网上查阅了相关资料,了解到其是基于FileReader Api。

众所周知,大家平时做兼容性都是为了兼容低版本浏览器,图片上传则恰恰相反。基于浏览器的安全策略,file标签在现代浏览器中已经获取不到真实路径。恰恰相反,低版本ie却能获取到真实物理路径。所以此功能是基于现代浏览器的解决方案。

FileReader就是html5为我们提供的读取文件的api。它的作用就是把文本流按指定格式读取到缓存,以供js调用。

FileReader有四种读取文件的方式:

1. readAsBinaryString读取为二进制码

2. readAsDataURL读取为 DataURL

3. readAsText读取为文本

4. readAsArrayBuffer

基于预览上传后图片的需求,需要将图片读取为DataURL。DataURL有固定格式,例如:data:[文件格式];base64,[文本流base64编码]。

  1. jpg格式:data:image/jpeg;base64,/9j/4...
  2. png格式: data:image/png;base64,iVBORw...
  3. gif格式:data:image/gif;base64,R0lGOD..

通过此格式我们就可以验证用户上传的图片类型。下面是本人写的简单demo:

html代码:

  <input id="files" type="file" onchange="previewImage(this, ‘prvid‘)" multiple="multiple">

  <div id="prvid">预览容器</div>

js代码:

  

function previewImage(file, prvid) {
/* file:file控件
* prvid: 图片预览容器
*/
var tip = "Expect jpg or png or gif!"; // 设定提示信息
var filters = {
"jpeg" : "/9j/4",
"gif" : "R0lGOD",
"png" : "iVBORw"
}
var prvbox = document.getElementById(prvid);
prvbox.innerHTML = "";
if (window.FileReader) { // html5方案
for (var i=0, f; f = file.files[i]; i++) {
var fr = new FileReader();
fr.onload = function(e) {
var src = e.target.result;
if (!validateImg(src)) {
alert(tip)
} else {
showPrvImg(src);
}
}
fr.readAsDataURL(f);
}
} else { // 降级处理

if ( !/\.jpg$|\.png$|\.gif$/i.test(file.value) ) {
alert(tip);
} else {
showPrvImg(file.value);
}
}

function validateImg(data) {
var pos = data.indexOf(",") + 1;
for (var e in filters) {
if (data.indexOf(filters[e]) === pos) {
return e;
}
}
return null;
}

function showPrvImg(src) {
var img = document.createElement("img");
img.src = src;
prvbox.appendChild(img);
}
}

时间: 2024-11-09 18:21:10

js实现图片上传预览原理的相关文章

JS实现图片上传预览效果:方法一

<script type="text/javascript"> //处理file input加载的图片文件 $(document).ready(function(e) { //判断浏览器是否有FileReader接口 if(typeof FileReader =='undefined') { /*$("#images_show").css({'background':'none'}).html('亲,您的浏览器还不支持HTML5的FileReader接口

移动端 js 实现图片上传 预览

方法一: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试页面</title> <script type="text/javascript"> /

js实现图片上传预览功能,使用base64编码来实现

实现图片上传的方法有很多,这里我们介绍比较简单的一种,使用base64对图片信息进行编码,然后直接将图片的base64信息存到数据库. 但是对于系统中需要上传的图片较多时并不建议采用这种方式,我们一般会选择存图片路径的方式,这样有助于减小数据库压力,base64 编码后的图片信息是一个很长的字符串,一般我们使用longText类型来将其存入数据库. html代码如下: <div class="col-sm-6"> <img id="headPortraitI

图片上传预览原理及实现

原理FileReader就是html5为我们提供的读取文件的api.它的作用就是把文本流按指定格式读取到缓存,以供js调用. FileReader有四种读取文件的方式: readAsBinaryString读取为二进制码 readAsDataURL读取为 DataURL readAsText读取为文本 readAsArrayBuffer 根据本次实现的目标,使用第二种方式即可.img标签的src就是这个图片的编码后的DataURL.如图所示: DataURL浅析 DataURL 说来可是有很多内

js实现图片上传预览功能,使用base64编码来实现

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <style type="text/css"> #preview, .img, img { width: 200px; height: 200px; } #preview { border:

来之不易的js图片上传预览代码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS

js:s上次预览,上传图片预览,图片上传预览

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

js前端实现多图图片上传预览

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>测试页面</title> <script type="text/javascript"> //下面用于

JavaScript 图片上传预览效果

图片上传预览是一种在图片上传之前对图片进行本地预览的技术.使用户选择图片后能立即查看图片,而不需上传服务器,提高用户体验.但随着浏览器安全性的提高,要实现图片上传预览也越来越困难.不过群众的智慧是无限的,网上已经有很多变通或先进的方法来实现.例如ie7/ie8的滤镜预览法,firefox 3的getAsDataURL方法.但在opera.safari和chrome还是没有办法实现本地预览,只能通过后台来支持预览.在研究了各种预览方法后,作为总结,写了这个程序,跟大家一起分享.上次写的简便无刷新文