项目中要使用Uploadify 3.2来实现图片上传并生成缩略通的功能,特此记下来,以供各位参考!
Uploadify下载地址:http://www.uploadify.com/download/
下载下来解压后估计里面很多文件,其实有用的也就.uploadify.min.、uploadify.css、uploadify.swf和uploadify-cancel.png这四个文件。你还得下载库,我这里用的是jquery-1.7.2.min.js,另外和大多数JQ插件一样,同时也需要swfobject.js这个插件,我的是2.2的版本,东西都准备好了,那下面就开始。
前端界面:
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="jqUploadify._Default" %>
- <!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 runat="server">
- <title>无标题页</title>
- <link href="scripts/uploadify.css" rel="stylesheet" type="text/css" />
- <link href="scripts/default.css" rel="stylesheet" type="text/css" />
- <script src="scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
- <script src="scripts/swfobject.js" type="text/javascript"></script>
- <script src="scripts/jquery.uploadify.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(function(){
- $("#file_upload").uploadify({
- //开启调试
- 'debug' : false,
- //是否自动上传
- 'auto':false,
- 'buttonText':'选择照片',
- //flash
- 'swf': "scripts/uploadify.swf",
- //文件选择后的容器ID
- 'queueID':'uploadfileQueue',
- 'uploader':'scripts/upload.ashx',
- 'width':'75',
- 'height':'24',
- 'multi':false,
- 'fileTypeDesc':'支持的格式:',
- 'fileTypeExts':'*.jpg;*.jpge;*.gif;*.png',
- 'fileSizeLimit':'1MB',
- 'removeTimeout':1,
- //返回一个错误,选择文件的时候触发
- 'onSelectError':function(file, errorCode, errorMsg){
- switch(errorCode) {
- case -100:
- alert("上传的文件数量已经超出系统限制的"+$('#file_upload').uploadify('settings','queueSizeLimit')+"个文件!");
- break;
- case -110:
- alert("文件 ["+file.name+"] 大小超出系统限制的"+$('#file_upload').uploadify('settings','fileSizeLimit')+"大小!");
- break;
- case -120:
- alert("文件 ["+file.name+"] 大小异常!");
- break;
- case -130:
- alert("文件 ["+file.name+"] 类型不正确!");
- break;
- }
- },
- //检测FLASH失败调用
- 'onFallback':function(){
- alert("您未安装FLASH控件,无法上传图片!请安装FLASH控件后再试。");
- },
- //上传到服务器,服务器返回相应信息到data里
- 'onUploadSuccess':function(file, data, response){
- //alert(data);
- }
- });
- });
- function doUplaod(){
- $('#file_upload').uploadify('upload','*');
- }
- function closeLoad(){
- $('#file_upload').uploadify('cancel','*');
- }
- </script>
- </head>
- <body>
- <table width="704" border="0" align="center" cellpadding="0" cellspacing="0" id="__01">
- <tr>
- <td align="center" valign="middle">
- <div id="uploadfileQueue" style="padding: 3px;">
- </div>
- <div id="file_upload">
- </div>
- </td>
- </tr>
- <tr>
- <td height="50" align="center" valign="middle">
- <img alt="" src="images/BeginUpload.gif" width="77" height="23" οnclick="doUplaod()" style="cursor: hand" />
- <img alt="" src="images/CancelUpload.gif" width="77" height="23" οnclick="closeLoad()" style="cursor: hand" />
- </td>
- </tr>
- </table>
- </body>
- </html>
后端的Handler:
- using System;
- using System.Collections;
- using System.Data;
- using System.Linq;
- using System.Web;
- using System.Web.Services;
- using System.Web.Services.Protocols;
- using System.Xml.Linq;
- using System.Web.SessionState;
- using System.IO;
- namespace jqUploadify.scripts
- {
- /// <summary>
- /// $codebehindclassname$ 的摘要说明
- /// </summary>
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- public class upload : IHttpHandler, IRequiresSessionState
- {
- public void ProcessRequest(HttpContext context)
- {
- context.Response.ContentType = "text/plain";
- context.Response.Charset = "utf-8";
- HttpPostedFile file = context.Request.Files["Filedata"];
- string uploadPath = context.Server.MapPath("..\\uploads\\");
- if (file != null)
- {
- if (!Directory.Exists(uploadPath))
- {
- Directory.CreateDirectory(uploadPath);
- }
- file.SaveAs(uploadPath + file.FileName);
- //生成缩略图
- MakeThumbnail(uploadPath + file.FileName, uploadPath + "\\s\\" + file.FileName, 80, 80);
- }
- }
- private void MakeThumbnail(string sourcePath, string newPath, int width, int height)
- {
- System.Drawing.Image ig = System.Drawing.Image.FromFile(sourcePath);
- int towidth = width;
- int toheight = height;
- int x = 0;
- int y = 0;
- int ow = ig.Width;
- int oh = ig.Height;
- if ((double)ig.Width / (double)ig.Height > (double)towidth / (double)toheight)
- {
- oh = ig.Height;
- ow = ig.Height * towidth / toheight;
- y = 0;
- x = (ig.Width - ow) / 2;
- }
- else
- {
- ow = ig.Width;
- oh = ig.Width * height / towidth;
- x = 0;
- y = (ig.Height - oh) / 2;
- }
- System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g.Clear(System.Drawing.Color.Transparent);
- g.DrawImage(ig, new System.Drawing.Rectangle(0, 0, towidth, toheight), new System.Drawing.Rectangle(x, y, ow, oh), System.Drawing.GraphicsUnit.Pixel);
- try
- {
- bitmap.Save(newPath, System.Drawing.Imaging.ImageFormat.Jpeg);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- finally
- {
- ig.Dispose();
- bitmap.Dispose();
- g.Dispose();
- }
- }
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
- }
- }
这样我们就是实现图片上传至uploads,生成的缩略图(这里设为80*80)存放在uploads下面的s文件夹中,是不是很简单呢!当然实际使用过程你还可能碰到一下的问题:
1、在火狐下session出现丢失的情况,可以参考这里:
2、IE9出现了按钮不能点击的问题,可以参考这里:
最后贴一个Uploadify参数说明:
Uploadify Version 3.2Options选项设置
auto 选择文件后自动上传buttonClass 给“浏览按钮”加css的class样式buttonCursor 鼠标移上去形状:arrow箭头、hand手型(默认)buttonImage 鼠标移上去变换图片buttonText 按钮文字checkExisting 在目录中检查文件是否已上传成功(1 ture,0 false)debug 是否显示调试框(默认不显示false)fileObjName 设置一个名字,在服务器处理程序中根据该名字来取上传文件的数据。默认为Filedata,$tempFile = $_FILES['Filedata']['tmp_name']fileSizeLimit 设置允许上传文件最大值B, KB, MB, GB 比如:'fileSizeLimit' : '20MB'fileTypeDesc 选择的文件的描述。这个字符串出现在浏览文件对话框中文件类型下拉框处。默认:All FilesfileTypeExts 允许上传的文件类型。格式:'fileTypeExts' : '*.gif; *.jpg; *.png'formData 附带值,需要通过get or post传递的额外数据,需要结合onUploadStart事件一起使用height “浏览按钮”高度pxitemTemplate <itemTemplate>节点表示显示的内容。这些内容中也可以包含绑定到控件DataSource属性中元素集合的数据。method 上传方式。默认:postmulti 选择文件时是否可以【选择多个】。默认:可以trueoverrideEvents 不执行默认的onSelect事件preventCaching 随机缓存值 默认true ,可选true和false.如果选true,那么在上传时会加入一个随机数来使每次的URL都不同,以防止缓存.但是可能与正常URL产生冲突progressData 进度条上显示的进度:有百分比percentage和速度speed。默认百分比queueID 给“进度条”加背景css的ID样式。文件选择后的容器IDqueueSizeLimit 允许多文件上传的数量。默认:999removeCompleted 上传完成后队列是否自动消失。默认:trueremoveTimeout 上传完成后队列多长时间后消失。默认 3秒 需要:'removeCompleted' : true,时使用requeueErrors 队列上传出错,是否继续回滚队列,即反复尝试上传。默认:falsesuccessTimeout 上传超时时间。文件上传完成后,等待服务器返回信息的时间(秒).超过时间没有返回的话,插件认为返回了成功。 默认:30秒swf swf文件的路径,本文件是插件自带的,不可用其它的代替.本参数不可省略uploader 上传处理程序URL,本参数不可省略uploadLimit 限制总上传文件数,默认是999。指同一时间,如果关闭浏览器后重新打开又可上传。width “浏览按钮”宽度pxEvents 事件onCancel 当取消一个上传队列中的文件时触发,删除时触发 onClearQueue 清除队列。当'cancel'方法带着*参数时,也就是说一次全部取消的时候触发.queueItemCount是被取消的文件个数(另外的按钮)onDestroy 取消所有的上传队列(另外的按钮)onDialogClose 当选择文件对话框关闭时触发,不论是点的'确定'还是'取消'都会触发.如果本事件被添加进了'overrideEvents'参数中,那么如果在选择文件时产生了错误,不会有错误提示框弹出onDialogOpen 当选择文件框被打开时触发,没有传过来的参数onDisable 关闭上传onEnable 开启上传onFallback 检测FLASH失败调用onInit 每次初始化一个队列时触发onQueueComplete 当队列中的所有文件上传完成时触发onSelect 当文件从浏览框被添加到队列中时触发onSelectError 选择文件出错时触发onSWFReady flash准备好时触发onUploadComplete当一个文件上传完成时触发onUploadError 当文件上传完成但是返回错误时触发onUploadProgress上传汇总onUploadStart 一个文件上传之间触发onUploadSuccess 每个上传完成并成功的文件都会触发本事件Methods 方法cancel 取消一个上传队列destroy 取消所有上传队列disable 禁止点击“浏览按钮”settings 返回或修改一个 uploadify实例的settings值stop 停止当前的上传并重新添加到队列中去upload 上传指定的文件或者所有队列中的文件
最后是DEMO的下载地址: