JavaScript实现多张图片上传功能
今天闲着没事,把之前的多张图片上传代码整理了下。
页面主要代码:
<div class="upBox upBox2">
<div class="d1">
<a class="redA1 rightA" href="javascript:choosePhotos();" id="continue_add_button" style="display:none;">继续添加</a>
</div>
<div class="d2" id="add_photo_button">
<a href="javascript:choosePhotos();" class="blueA1">从电脑上传照片</a>
<p class="p1">注:支持JPG格式多张上传,按住Ctrl或Shift选择图片,一次最多可上传150张照片</p>
</div>
<input type="file" id="upload" accept="image/jpeg" multiple="multiple" style="display:none;" />
<canvas id="myCanvas" style="display:none;"></canvas>
<div class="d3">
<ul class="ul1 clearfix" id="local_upload_div"> </ul>
</div>
</div>
js部分主要代码,其实不用html5的画布也行,不过貌似用画布页面加载比直接预览图较快。
具体上传代码没写,和单张上传是一样的,需要的朋友可以去我的另一篇写单张上传的博客里看一下:JavaScript实现单张图片上传功能
//准备上传的模板
var mb_upload = "<li id=\"up_li_INDEX\">"+
"<div>"+
"<div class=\"imgD\">" +
"<img id=\"up_img_INDEX\" src=\"/img/upload/morenI.png\" >"+
"</div>" +
"<p class=\"jdP\" id=\"up_p_INDEX\">" +
"<img class=\"i1\" src=\"/img/upload/loading.gif\">"+
"准备上传"+
"</p>" +
"</div>"+
"</li>"; $(function(){
//文件域改变时触发
$('#upload').change(function (evt) {
fileChange(evt);
});
}); //触发文件域
function choosePhotos(){
$("#upload").click();
} //文件域改变时触发
function fileChange(evt){
var files = evt.target.files;
if(files.length == 0)return;
//上传页面已有照片数量
var up_page_num = $("#local_upload_div li").length; $("#add_photo_button").hide();
$("#continue_add_button").show(); layer.msg('照片加载中', {icon: 16}); for(var m=0; m<files.length; m++){
var f = files[m];
console.log("type="+f.type+" name="+f.name+" length="+f.size);
addPhoto(m+1+up_page_num);
}
getImagesInfo(files,0,up_page_num); } //页面添加等待上传的预显示图片
function addPhoto(i){
var segment = mb_upload;
segment = segment.replace(/INDEX/g,i);
$("#local_upload_div").append(segment);
} //获取到照片信息并在页面添加预览图
var getImagesInfo = function(files,a,up_page_num){ if(files.length > a){ usUploading = true; var f = files[a]; ///var type = f.type;
//获取容器
var c = document.getElementById("myCanvas");
//获取画布对象
var cxt = c.getContext("2d"); var reader = new FileReader(); var name = f.name;//完整照片名称,带格式 //异步方法,文件读取完毕才执行
reader.onload = function(e){
//图片的读取结果
var dataImg = e.target.result;
var img = new Image();
//异步方法
img.onload = function(){
var ratio = img.width/img.height;
var h,w;
//等比例压缩宽和高
if(ratio>1){
w = 110;
h = w*img.height/img.width;
}else{
h = 110;
w = h*img.width/img.height;
}
//容器设置宽和高
c.width = w;
c.height = h;
//清空容器
cxt.clearRect(0, 0, w, h);
//开始作画
cxt.drawImage(img,0,0,w,h);
//获取容器中画的url
var compressed = c.toDataURL("image/jpeg"); //将预览图插入上传页面
$("#up_img_"+(a+1+up_page_num)).attr("src",compressed);
$("#up_img_"+(a+1+up_page_num)).show("slow"); syncUpload(files,dataImg,a,name,up_page_num);
};
//将图片的读取结果赋到img对象的src属性上
img.src = dataImg;
};
//将图片读取为URL数据:base64编码
reader.readAsDataURL(f);
}
} //原图上传
var syncUpload = function(files,imgStr,index,name,up_page_num){ sleep(1000);//延时1s,模拟ajax,O(∩_∩)O哈哈~ //这里就是和单张上传逻辑一样了,只不过在上传成功后再次调用上面的方法,具体上传的方法就不写了
$("#up_p_"+(index+1+up_page_num)).html("<img class=\"i1\" src=\"/img/upload/duihao2.png\">"+
"上传成功"+
"<a href=\"javascript:void(0);\" class=\"right\"><img class=\"i2\" src=\"/img/upload/shanI.gif\"></a>"); getImagesInfo(files,++index,up_page_num); }; //设置延时函数
function sleep(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)return;
}
}
看看基本效果O(∩_∩)O:

JavaScript实现多张图片上传功能的更多相关文章
- JavaScript实现单张图片上传功能
前台jsp代码 <%@ page language="java" pageEncoding="UTF-8" contentType="text/ ...
- jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能
Ajax file upload plugin是一个功能强大的文件上传jQuery插件,可自定义链接.或其它元素庖代传统的file表单上传结果,可实现Ajax动态提示文件上传 过程,同时支撑多文 ...
- 用原生JS实现多张图片上传及预览功能(兼容IE8)
最近需要做一个图片上传预览的功能(兼容IE8-11.chrome.firefox等浏览器),网上现有的文件上传组件(如webuploader)总是会遇到一些兼容性问题.于是我参考了一些博文(链接找不到 ...
- OneThink实现多图片批量上传功能
OneThink原生系统中的图片上传功能是uploadify.swf插件进行上传的,默认是只能上传一张图片的,但是uploadify.swf是支持多图片批量上传的,那么我们稍加改动就可实现OneThi ...
- PHP语言学习之php做图片上传功能
本文主要向大家介绍了PHP语言学习之php做图片上传功能,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. 今天来做一个图片上传功能的插件,首先做一个html文件:text.php < ...
- ASP.NET MVC4实现TinyMCE 4.0.20自定义上传功能
tinymce 插件不提供免费的本地图片上传功能,所以自己将uploadify这个上传插件整合到tinymce,实现本地上传,还用到了jquery.ui插件,先展示全部的代码 @model TinyM ...
- PHP 文件上传功能
<?php /** * TestGuest Version1.0 * ================================================ * Web:2955089 ...
- 使用ThinkPHP+Uploadify实现图片上传功能
首先,将下载的Uploadify压缩包解压放到公共文件夹内.实现代码如下: 前台html部分: <script src="/uploadify/jquery.min.js" ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能
日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...
随机推荐
- javascript中的getter和setter
在ECMAScript 5中,属性值可以用一个或两个方法代替,这两个方法就是getter和setter var man = { name : 'lidg', weibo : '@lidg', get ...
- [leetcode]17. Letter Combinations of a Phone Number手机键盘的字母组合
Given a string containing digits from 2-9 inclusive, return all possible letter combinations that th ...
- Tomcat9.0.13 Bug引发的java.io.IOException:(打开的文件过多 Too many open files)导致服务假死
问题背景: 笔者所在的项目组最近把生产环境Tomcat迁移到Linux,算是顺利运行了一段时间,最近一个低概率密度的(too many open files)问题导致服务假死并停止响应客户端客户端请求 ...
- python 函数进阶与闭包
函数的命名空间和作用域 引言 现在有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了: NameErro ...
- git 忽略文件不起作用
本人需要提交项目文件,发现总有一些东西不需要提交,然后搜索有”.gitignore”文件可以忽略一些提交,但是发现添加上没有起作用. 要贴的是: /build/ target/ .idea/ *.im ...
- 选择困难症的福音——团队Scrum冲刺阶段-Day 2
选择困难症的福音--团队Scrum冲刺阶段-Day 2 今日进展 编写提问部分 如何将不同的问题选项连接到不同的下一个问题 如何保证问题的链接不会弄丢 登陆注册界面 完成密码可见与不可见的更改 ui界 ...
- [翻译]高并发框架 LMAX Disruptor 介绍
原文地址:Concurrency with LMAX Disruptor – An Introduction 译者序 前些天在并发编程网,看到了关于 Disruptor 的介绍.感觉此框架惊为天人,值 ...
- Hadoop 系列(三)Java API
Hadoop 系列(三)Java API <dependency> <groupId>org.apache.hadoop</groupId> <artifac ...
- c++沉思录 学习笔记 第五章 代理类
Vehicle 一个车辆的虚基类 class Vehicle {public: virtual double weight()const = 0; virtual void start() = 0; ...
- ABP .NET corej 版本 第一篇
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP使用以下技术: 服务器端: l ASP.NET MVC 5.Web API 2.C# 5. ...