基于bootstrap样式的asp.net+plupload多图片文件上传预览及展示
在前几天发表了一个基于jquery的上传插件plupload,最近时间比较紧,写的太仓促了,很多人不明白啥意思。。。我也很无奈。
今天直接上个干货:基于Bootstrap样式的asp.net+plupload多图片文件上传预览及展示
功能说明:
1、基于bootstrap样式,美观大方,现在比较流行。
2、开发成asp.net的控件:ascx格式。可以在项目中直接使用
3、支持多图片
4、支持预览
5、支持上传成功后动画提示并删除已成功的。
6、支持从服务器端列表展示图片
7、其他
效果图:
选择图片,可以多选。

点击开始上传后的动画处理:

图片列表:

没有耐心的同学可以直接下载代码:
百度网盘下载:链接:http://pan.baidu.com/s/1bnjHP63 密码:j6rf
下面从前端设计UI和后台的服务代码进行一一说明。关于bootstrap的资料可以在本站搜索一下。
一、项目目录说明:

这是整个asp.netwen项目目录。
1:bootstrap的资源目录
2、dll:是我们项目使用的dll,其中只有一个json的序列化和反序列化dll:Newtonsoft.Json。参考:[Jquery+ashx 实现ajax访问服务端json数据代码示例]
3、upload是我放置plupload资源的目录。其中,可以看到4:是我添加的asp.net 一般处理程序,处理上传文件的。
5、测试界面,直接引用了控件6:upload.aspx
整个目录说明完了。
二、现在直接上代码说明
upload.ascx前台代码:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="upload.ascx.cs" Inherits="UserControl_upload" %>
<script type="text/javascript" src="../../JScripts/Upload/moxie.js"></script>
<script type="text/javascript" src="../../JScripts/Upload/plupload.dev.js"></script>
<style>
.liclickaaa { border:1px solid #F00}
.listData {
margin:10px 20px 0px 0px;
font-size:16px;
}
.lipadihgi {
margin:10px 20px 10px 10px;
font-size:16px;
}
</style>
<div class="page-header">
<h2>
<small>
<i class="icon-double-angle-right"></i>
上传和选择素材
</small>
</h2>
</div>
<!-- /.page-header -->
<div class="col-sm-12" id="divcontent">
<div>
点击上传文件,或者点击从素材库选择,选择已有的图片
</div>
<div class="tabbable">
<ul class="nav nav-tabs" id="myTab">
<li class="active">
<a data-toggle="tab" href="#wenben">
<i class="green icon-home bigger-110"></i>
上传新素材
</a>
</li>
<li>
<a data-toggle="tab" href="#tupian">从素材库选择
</a>
</li>
</ul>
<div class="tab-content">
<div id="wenben" class="tab-pane in active">
<div class="row">
<div class="col-xs-10">
<div class="col-xs-4">
<button class="btn btn btn-sm btn-info" id="browse" type="button">选择文件...</button>
</div>
<div class="col-xs-4">
<button class="btn btn btn-sm btn-info" id="BtnStart" onclick="StartUp(); return false;" type="button">开始上传</button>
</div>
<div class="col-xs-10">
<ul class="ace-thumbnails" id="imageListtemp">
</ul>
</div>
</div>
</div>
</div>
<div id="tupian" class="tab-pane">
<div class="row">
<div class="col-xs-12">
<!-- PAGE CONTENT BEGINS -->
<div class="col-xs-6">
<button class="btn btn btn-sm btn-info" id="refreshs" type="button" onclick="GetMediaList(); return false;" >刷新素材库</button>
<button class="btn btn btn-sm btn-info" id="btnokselect" type="button" onclick="SeelctedOK(); return false;" >确定选择</button>
</div>
<div class="col-xs-10 row-fluid" id="divimageList" style="height:500px;overflow-y:auto;">
<ul class="ace-thumbnails" id="imageList" >
</ul>
</div>
<!-- PAGE CONTENT ENDS -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->
</div>
</div>
</div>
</div>
<div>
<input type="hidden" runat="server" id="hidValueContainer" />
</div>
<!-- /span -->
上传脚本:
var whoid = 1;
var uploader = new plupload.Uploader({ //实例化一个plupload上传对象
browse_button: 'browse',
url: '../../JScripts/Upload/UploadSvc.ashx',
flash_swf_url: '../../JScripts/Upload/Moxie.swf',
silverlight_xap_url: '../../JScripts/Upload/Moxie.xap',
max_file_size: '10mb', //最大文件限制
file_size: '1mb', //一次上传数据大小
multipart_params: {
Operate: "uploadmedia",
"who": whoid
}, //传到后台的参数
unique_names: true, //是否自动生成唯一名称
filters: {
mime_types: [ //只允许上传图片文件
{ title: "图片文件", extensions: "jpg,gif,png" }
]
},
init: {
FileUploaded: function (up, file, info) {
if (info.response != null) {
var jsonstr = eval("(" + info.response + ")");
if (jsonstr== "ok") {
$("#fileuploadok-" + file.id).html("上传成功。");
setTimeout("DeleteUpokImg('" + file.id + "')", 1000);
}
else {
$("#fileuploadok-" + file.id).html("上传失败。" + info.response);
}
//for (var i = 0; i < jsonstr.length; i++) {
// var thumbnailUrl = jsonstr[i].thumbnailUrl;
// var originalUrl = jsonstr[i].originalUrl;//上传完整路径
// var name = jsonstr[i].name;//图片名
// //一个文件上传成功
// addImage(name, originalUrl, thumbnailUrl);
//}
}
},
Error: function (up, args) {
//发生错误
if (args.file) {
alert('文件错误:' + args.file);
} else {
alert('出错' + args);
}
}
}
});
uploader.init(); //初始化
//$("#1").remove();
function DeleteUpokImg(id) {
$("#file-" + id).hide(1000, function() {
//移除父级div
$("#file-" + id).remove();
});
}
//绑定文件添加进队列事件
uploader.bind('FilesAdded', function (uploader, files) {
for (var i = 0, len = files.length; i < len; i++) {
var file_name = files[i].name; //文件名
//构造html来更新UI
var html = '<li id="file-' + files[i].id + '"><p id="fileuploadok-' + files[i].id + '" style="width:100px;height:10px;" class="file-name">'
+ file_name + '</p><p class="progress"></p></li>';
//显示刚才的图片
//var html = "";
//html = html + " <li >";
//html = html + " <div class='listData' id=\"div_" + data.Mediaobj.media_id + "\" onclick=\"SetLiStyle('" + data.Mediaobj.media_id + "','" + data.Url + "')\" >";
//html = html + " </div> ";
//html = html + " </li>";
$(html).appendTo('#imageListtemp');
!function (i) {
previewImage(files[i], function (imgsrc) {
$('#file-' + files[i].id).append('<img width=\'140px\' height=\'120px\' src="' + imgsrc + '" />');
})
}(i);
}
});
///开始上传。
function StartUp() {
uploader.start();
}
function SeelctedOK() {
var idd=$("#<%=hidValueContainer.ClientID %>").val();
var _contanierid = $("#" + idd);
if (_contanierid.length > 0) {//控件存在的话
if (fileurl.length == 0) {
alert("请选择一个图片");return;
}
_contanierid.val(fileurl);
var modalf = $('#modal-form');
if (modalf) modalf.modal('hide');
}
}
//plupload中为我们提供了mOxie对象
//有关mOxie的介绍和说明请看:https://github.com/moxiecode/moxie/wiki/API
//如果你不想了解那么多的话,那就照抄本<a href="http://www.suchso.com/catalog.asp?cate=2" class="keylink" title=" 示例" target="_blank">示例</a>的代码来得到预览的图片吧
function previewImage(file, callback) {//file为plupload事件监听函数参数中的file对象,callback为预览图片准备完成的回调函数
if (!file || !/image\//.test(file.type)) return; //确保文件是图片
if (file.type == 'image/gif') {//gif使用FileReader进行预览,因为mOxie.Image只支持jpg和png
var fr = new mOxie.FileReader();
fr.onload = function () {
callback(fr.result);
fr.destroy();
fr = null;
}
fr.readAsDataURL(file.getSource());
} else {
var preloader = new mOxie.Image();
preloader.onload = function () {
preloader.downsize(300, 300);//先压缩一下要预览的图片,宽300,高300
var imgsrc = preloader.type == 'image/jpeg' ? preloader.getAsDataURL('image/jpeg', 80) : preloader.getAsDataURL(); //得到图片src,实质为一个base64编码的数据
callback && callback(imgsrc); //callback传入的参数为预览图片的url
preloader.destroy();
preloader = null;
};
preloader.load(file.getSource());
}
}
$(document).ready(function () {
GetMediaList();
});从服务端获取图片脚本:
//获取媒体文件。根据类型产生不一样的html
function GetMediaList() {
var ajaxUrl = '../../JScripts/Upload/UploadSvc.ashx';
$.ajax({
type: "post",
url: ajaxUrl,
data: {
Operate: "getmedia"
},
success: function (data, textStatus) {
if (data != null) {
if (data.length > 0) {
//显示刚才的图片
var html = "";
$.each(data, function (i, val) {
html = html + " <li class='lipadihgi'>";
html = html + " <div id=\"div_" + val.FIlename + "\" onclick=\"SetLiStyle('" + val.FIlename + "','"
+ val.FileUrll + "')\" >";
html = html + " <img width='180px' height='180px' src=\"" + val.FileUrll + "\" />";
html = html + " </div> ";
html = html + " </li>";
});
$("#imageList").html("");
$("#imageList").append(html);
}
}
},
complete: function (XMLHttpRequest, textStatus) {
},
error: function (e) {
alert("获取素材失败" + e); return;
}
});
}
var fileurl = "";
function SetLiStyle(liid, url) {
fileurl = url;
$("#imageList div").removeClass("liclickaaa");
$("#div_" + liid).addClass("liclickaaa");
}UploadSvc.ashx一般处理程序,接收js提交的$.ajax请求:
获取上传的文件,保存到服务器的文件夹中:
private object UploadImage()
{
object returnobj = "ok";
string who = GetResponse("who");
HttpFileCollection files = HttpContext.Current.Request.Files;
int count = files.Count;
for (int i = 0; i < count; i++)
{
HttpPostedFile file = files[i];
string tmpPath = HttpContext.Current.Server.MapPath("/Upload/Media/");
string fileName = System.IO.Path.GetFileName(file.FileName);
try
{
string severlocalpath = tmpPath + fileName;
file.SaveAs(severlocalpath);
returnobj = "ok";
}
catch (Exception ex)
{
returnobj = ex.Message;
}
}
return returnobj;
}返回服务端的图片文件列表:
private object GetMedia()
{
System.Collections.Generic.List<FileINfo> lit = new System.Collections.Generic.List<FileINfo>();
string tmpPath = HttpContext.Current.Server.MapPath("/Upload/Media/");
string imgtype = "*.bmp|*.jpg|*.gif|*.png";
string[] ImageType = imgtype.Split('|');
for (int i = 0; i < ImageType.Length; i++)
{
string[] dirs = System.IO.Directory.GetFiles(tmpPath, ImageType[i]);
int j = 0;
foreach (string dir in dirs)
{
System.IO.FileInfo file = new System.IO.FileInfo(dir);
FileINfo finfo = new FileINfo();
finfo.FIlename = j.ToString();
finfo.FileUrll = "../../Upload/Media/" + file.Name;
lit.Add(finfo);
j++;
}
}
return lit;
}三、其他功能说明:
1)、获取post或者get方式过来的参数,我加了一个处理函数都能处理:
public string GetResponse(string responsevalue)
{
//判断提交方式
HttpContext context = HttpContext.Current;
string id = "";
if (context.Request.RequestType.ToLower() == "get")
{
if (context.Request.QueryString[responsevalue] == null)
{
return "";
}
id = context.Request.QueryString[responsevalue];
}
else
{
if (context.Request.Form[responsevalue] == null)
{
return "";
}
id = context.Request.Form[responsevalue];
}
return id;
}2)、在点击素材库的图片时,可以看到会变化样式,标示当前选中的,这是一段js+css实现的:
$("#imageList div").removeClass("liclickaaa");
$("#div_" + liid).addClass("liclickaaa");upload.ascx:定义一个隐藏控件,放置引用页面的控件ID:3)、选中的图片的url填充到引用页面的控件中:
<input type="hidden" runat="server" id="hidValueContainer" />
后台接收控件ID
public void SetFileInputID(string valueid)
{
hidValueContainer.Value = valueid;
}Default.aspx页面调用上面的函数,配置容器ID:
JqueryPUpload.SetFileInputID("tstinput");整个功能都讲完了。希望对大家使用jquery.ui.plupload有帮助。
