asp教程

实现ASP上传文件进度条

位置:首页 > asp教程 > asp技巧,2012-10-22
这是关于实现ASP上传文件进度条的代码,asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,比较常用的组件swfUpload和uploadify,我用的第二个。示例中用...

这是关于实现ASP上传文件进度条的代码,asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,比较常用的组件 swfUpload和uploadify,我用的第二个。

示例中用到了.ashx文件,作用如下:

它和.aspx很类似。.aspx是如何工作的呢?也许你知道,.aspx能处理来自外部传 入的请求,然后它还能处理这个请求并生成一个html作为结果返回。这是典型的处理外部请求的方式。.aspx就是专门为处理“典型”的请求而出现的。那 么如果我们现在需要一种又能处理外部请求又需要我们自定义的处理这个请求那又要怎么做呢?(也就是不实用“典型”的方式来处理)。.ashx就能帮你做到 这一点。
  首先你发现 <%@ WebHandler Language="C#" Class="ImageHandler" %>这句话。想想一个ASP.NET的页面是不是也有类似的东西。其实它表明了现在的这个文件可以处理一个来自外部的请求。当然就它是不行的。
  接下来关键的东西就是底下建立的类,它实现了一个关键的接口:IHttpHandler。实现这个接口表明你现在将以何种方式来处理来自外部的请求。其中 有一个方法和属性需要实现,你可以在ProcessRequest方法中编写如何处理请求的细节而IsReusable表明其它的请求是否可以使用这个类 的一个实例。我们可以暂时忽略IsReusable属性。将焦点转到ProcessRequest方法上。在ProcessRequest中有一个参数 context它是一个HttpContext类型,context对象提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。也就是可以访问我们的几大服务器对象。
  现在来看个简单的例子。
  请在你自己建立的WEB站点文件夹中随便放一个图片。我的想法是这样,我先将一个图片读取成一个二进制的数据然后在将这个二进制的数据转变成一个图片。这其中需要你建立两个文件。一个.ASPX文件和现在我们要实用的.ASHX文件。


  <%@ WebHandler Language="C#" Class="ImageHandler" %>

  using System;
  using System.Web;
/// <summary>
/// 这就一个没有任何实现的一般处理程序。
/// </summary>
public class ImageHandler : IHttpHandler {
   
  public void ProcessRequest (HttpContext context)
  {
  //获取虚拟目录的物理路径。 
  string path = context.Server.MapPath("");
  //获取图片文件的二进制数据。
  byte[] datas = System.IO.File.ReadAllBytes(path + "\\U1513.jpg");
  //将二进制数据写入到输出流中。
  context.Response.OutputStream.Write(datas, 0, datas.Length);
  }
 
  public bool IsReusable {
  get {
  return false;
  }
  }
}
另一个default.aspx文件中,
注 意上面的代码:<asp:Image ID="Image1" runat="server" ImageUrl="~/ImageHandler.ashx"/></div> 中ImageUrl指向的是ImageHandler.ashx文件。

项目中要求有已存在相同名称文件提示是否保存的问题。网上的例子看了没有相关的方法,一般是直接覆盖或者有存在文件会出现问题。我查了查具插件的使用方法,有个onComplete方法:

onComplete:文件上传完成后触发。该函数有四个参数event、queueId、fileObj、response、data五个参数,前三个参数同上。response为后台处理程序返回的值,在上面的例子中为1或0,data有两个属性fileCount和speed

  • fileCount:剩余没有上传完成的文件的个数。
  • speed:文件上传的平均速率 kb/s

注:fileObj对象和上面讲到的有些不太一样,onComplete 的fileObj对象有个filePath属性可以取出上传文件的路径。

其中后台   context.Response.Write("返回内容");

这样的话我只要将返回内容改为返回的文件名称就可以了(前提是如果有相同的文件名那么我就在此名后面加入一个序号)。返回aspx页面在于之前名称作比较,如果不同则说明系统中存在相同文件名字的文件。如此则返回一个提示窗口。

直接上代码:

aspx页面

 'onComplete': function (event, queueId, fileObj, response, data) {
                    //                    alert(response);
                    //                    alert(fileObj.filePath);
                    //                    alert(fileObj.name);
                    if (response != fileObj.name) {
                        //alert(fileObj.name + "在系统中已经存在!" + "\r\n" + "保存为:" + response);

                        if (confirm("文件中已经存在名称:" + fileObj.name + "\r\n" + "选择确定将覆盖\r\n选择取消将保存为:" + response) == true) {
                            // alert("确定");
                            $.get("WebForm1.aspx", { FileName: fileObj.name, path: fileObj.filePath, newName: response });
                        }
                        else {
                            // alert("取消");
                        }


                    }
                }

ashx页面

 if (File.Exists(aa + fileName))
            {

                int i = 1;   //ok!
                while (File.Exists(aa + originalFileName + "_" + i.ToString() + fileExtension))
                {
                    i++;
                }
                fileName = originalFileName + "_" + i.ToString() + fileExtension;
            }

              //保存文件至服务器
            file.SaveAs(uploadPath + fileName);//此处若改file.FileName为“sss”存入的名字就是sss
            //下面这句代码缺少的话,上传成功后上传队列的显示不会自动消失
           // context.Response.Write("1");
            context.Response.Write(fileName);
        }
        else
        {
            context.Response.Write("0");
        }

 最后客户请求处理aspx页面:

            string fileName = Request.QueryString["FileName"];
            string path = Request.QueryString["path"];
            string newName = Request.QueryString["newName"];
            //  Directory.CreateDirectory(Server.MapPath("a"));
            FileStream fs;
            //  fs = File.Create(Server.MapPath("UploadFile\\aaa.txt"));

            //删除文件
            File.Delete(Server.MapPath("myfile8\\" + fileName));
            //移动文件
            File.Move(Server.MapPath("myfile8\\" + newName), Server.MapPath("myfile8\\" + fileName));

TAGS:ASP上传文件进度条ASP文件上传进度条

猜你喜欢

NewHot