加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

asp.net单文件带进度条上传的解决方案

发布时间:2016-11-22 01:51:08 所属栏目:MsSql教程 来源:站长网
导读:最近做项目中遇到很多问题,比如带进度条的文件上传,看了网上很多资料还没找到真正意义上的ASP.NET实现进度条上传(可能是我没找到),下面我来跟大家分享一下我实现的这个程序。 首先看下界面效果,当然你可以完全修改界面为你自己所用。 先解释一下这个

第三步,创建Default.aspx文件,用于提交表单时上传文件。

using System; 
 
namespace UploadHandler 
{ 
 public partial class UploadHandlerDefault : System.Web.UI.Page 
 { 
  protected void Page_Load(object sender, EventArgs e) 
  { 
   string guid = Request.Params["guid"]; 
   UploadUtil utilHelp = new UploadUtil(this, guid); 
   utilHelp.Upload(); 
  } 
 } 
} 

上传核心代码:

using System; 
using System.Web; 
using System.IO; 
using System.Configuration; 
using System.Web.UI; 
using System.Web.Caching; 
using System.Threading; 
public class UploadUtil 
{ 
 private Stream _reader; 
 private FileStream _fStream; 
 private const int Buffersize = 10000; 
 private readonly string _filePath =new Page().Server.MapPath(ConfigurationManager.AppSettings["upload_folder"]); 
 private readonly Page _page; 
 private readonly string _guid; 
 public UploadUtil(Page page, string guid) 
 { 
  _page = page; 
  _guid = guid; 
 } 
 public void Upload() 
 { 
  if (_page.Request.Files.Count > 0) 
  { 
   DoUpload(_page.Request.Files[0]); 
  } 
 } 
 private void DoUpload(HttpPostedFile postedFile) 
 { 
  bool abort = false; 
  string uploadFilePath = _filePath + DateTime.Now.ToFileTime()+"//"; 
  if (!Directory.Exists(uploadFilePath)) 
  { 
   Directory.CreateDirectory(uploadFilePath); 
  } 
  string uploadFileName = postedFile.FileName; 
  DownloadingFileInfo info = new DownloadingFileInfo(uploadFileName, postedFile.ContentLength, postedFile.ContentType); 
  object fileObj = HttpContext.Current.Cache[_guid]; 
  if (fileObj != null) 
  { 
   HttpContext.Current.Cache.Remove(_guid); 
  } 
  HttpContext.Current.Cache.Add(_guid, info, null, DateTime.Now.AddDays(1), TimeSpan.Zero, CacheItemPriority.AboveNormal, null); 
  DateTime begin=DateTime.Now.ToLocalTime(); 
  _fStream = new FileStream(uploadFilePath + uploadFileName, FileMode.Create); 
  _reader = postedFile.InputStream; 
  byte []buffer=new byte[Buffersize]; 
  int len = _reader.Read(buffer,0,Buffersize); 
 
  while (len > 0&&!abort) 
  { 
   _fStream.Write(buffer,0,len); 
   DateTime end = DateTime.Now.ToLocalTime(); 
   info.CostTime = (long)(end - begin).TotalMilliseconds; 
   info.FileFinished += len; 
 
   //模拟延时用,实际应用的时候注销他 
   Thread.Sleep(1000); 
 
   HttpContext.Current.Cache[_guid] = info; 
   abort=((DownloadingFileInfo)HttpContext.Current.Cache[_guid]).Abort; 
   len = _reader.Read(buffer,0,Buffersize); 
  } 
  
  _reader.Close(); 
  _fStream.Close(); 
  if (abort) 
  { 
   if (File.Exists(uploadFilePath + uploadFileName)) 
   { 
    File.Delete(uploadFilePath + uploadFileName); 
   } 
  } 
 } 
  
}

 

第四步,创建Handler.ashx文件,用于查看文件上传情况。

<%@ WebHandler Language="C#" Class="ProgressHandler.Handler" %> 
 
using System.Web; 
using System.Xml.Linq; 
 
namespace ProgressHandler 
{ 
 public class Handler : IHttpHandler 
 { 
  /// <summary> 
  /// 获得上传文件的进度 
  /// </summary> 
  /// <param name="context">当前请求实体</param> 
  /// <creattime>2015-06-28</creattime> 
  /// <author>FreshMan</author> 
  public void ProcessRequest(HttpContext context) 
  { 
   context.Response.ContentType = "application/xml"; 
   context.Response.Charset = "utf-8"; 
   var guid = context.Request.Form["guid"]; 
   var info = context.Cache[guid] as DownloadingFileInfo; 
   var doc = new XDocument(); 
   var root = new XElement("root"); 
   if (info != null) 
   { 
    var fileName = new XElement("fileName", info.FileName); 
    var fileFinished = new XElement("fileFinished", info.FileFinished); 
    var fileSize = new XElement("fileSize", info.FileSize); 
    var costTime = new XElement("costTime", info.CostTime); 
    var fileState = new XElement("fileState", info.FileState); 
    var speed = new XElement("speed", info.Speed); 
    var percent = new XElement("percent", info.Percent); 
    var abort = new XElement("abort", false); 
    root.Add(fileName); 
    root.Add(fileFinished); 
    root.Add(fileSize); 
    root.Add(costTime); 
    root.Add(fileState); 
    root.Add(speed); 
    root.Add(percent); 
    if (info.Abort) 
    { 
     abort.Value = info.Abort.ToString(); 
     context.Cache.Remove(guid); 
    } 
    if (info.FileState == "finished") 
    { 
     context.Cache.Remove(guid); 
    } 
   } 
   else 
   { 
    var none = new XElement("none", "no file"); 
    root.Add(none); 
   } 
   doc.Add(root); 
   context.Response.Write(doc.ToString()); 
   context.Response.End(); 
  } 
 
  public bool IsReusable 
  { 
   get { return false; } 
  } 
 } 
} 

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读