文件的上传与下载

文件的上传与下载

不管是上传也好,下载也好,都需要得到文件的路径
所以,在介绍文件的上传也下载之前,首先还得了解如何操作文件路径

/*
 * 传入参数: _FullName = @"C:Temp emp.txt";
 
*/


/// <summary>
/// 得到没有后缀的文件名
/// </summary>
/// <param name="_FullName"></param>
/// <returns></returns>

public   static   string  GetFileName( string  _FullName)
{
    
return Path.GetFileNameWithoutExtension(_FullName);
}

// ---------------------------------->
//  返回值: temp
//  这里不会返回文件的后缀
//  如果传入的文件名是temp.temp.txt方法将返回temp.temp
// ---------------------------------->

/// <summary>
/// 得到文件扩展名
/// </summary>
/// <param name="_FullName"></param>
/// <returns></returns>

public   static   string  GetExtension( string  _FullName)
{
    
return Path.GetExtension(_FullName);
}

// ---------------------------------->
//  返回值: .txt
//  这里值得注意的是它返回时将"."包含进去了
// ---------------------------------->

/// <summary>
/// 得到文件名
/// </summary>
/// <param name="_FullName"></param>
/// <returns></returns>

public   static   string  GetFileName( string  _FullName)
{
    
return Path.GetFileName(_FullName);
}

// ---------------------------------->
//  返回值: temp.txt
//  文件名 + . + 后缀
// ---------------------------------->


文件的上传于下载

/*
 * 传入参数: _DevicePath = @"C:Temp";
 *           _FileUpload = [System.Web.UI.WebControls.FileUpload];
 *           out _NewFileName = null;
 
*/


/// <summary>
/// 上传文件
/// </summary>
/// <param name="_DevicePath">需要保存到的根路径</param>
/// <param name="_FileUpload">文件上传控件</param>
/// <param name="_NewFileName">返回一个生成后的文件名</param>
/// <returns></returns>

public   static   bool  UpLoadFile( string  _DevicePath, System.Web.UI.WebControls.FileUpload _FileUpload,  out   string  _NewFileName)
{
    _NewFileName 
= String.Empty;
    StringBuilder sbPath 
= new StringBuilder();
    sbPath.Append(_DevicePath);

    
// 检查目录是否存在
    if (!Directory.Exists(sbPath.ToString()))
    
{
 
try
 
{
     
// 如果不存在就创建目录
     Directory.CreateDirectory(sbPath.ToString());
 }

 
catch (System.Exception ex)
 
{
     
return false;
 }

    }


    
string FullName = _FileUpload.PostedFile.FileName; // 得到上传文件全路径
    string FileExtension = FileUtil.GetExtension(FullName); // 得到扩展名
    
// 随机生成文件名
    Random random = new Random(DateTime.Now.Millisecond);
    
string FileName = DateTime.Now.ToString("yyyyMMddHHmmss"+ DateTime.Now.Millisecond.ToString() + random.Next(int.MaxValue).ToString();
    _NewFileName 
= FileName;
    sbPath.Append(FileName); 
// 增加随机生成后的文件名
    sbPath.Append(FileExtension); // 加上后缀名
    try
    
{
 
// 上传到指定文件夹
 _FileUpload.PostedFile.SaveAs(sbPath.ToString());
    }

    
catch (System.Exception ex)
    
{
 
return false;
    }

    
return true;
}

// ---------------------------------->
//  返回值: out _NewFileName 的值是一个随机生成的文件名 yyyyMMddHHmmss + "毫秒数" + "随机数".txt
// ---------------------------------->


/*
 * 传入参数: _DevicePath = @"C:Temp emp.txt";
 
*/


/// 下载文件第一种方法
/// <summary>
/// 下载文件
/// </summary>
/// <param name="_Path"></param>

public   static   void  DownloadFileBinary( string  _Path)
{
    
// 新建一个只读的文件流
    System.IO.FileStream fstream = new FileStream(_Path, FileMode.Open);
    
//设置基本信息
    System.Web.HttpContext.Current.Response.Buffer = false;
    System.Web.HttpContext.Current.Response.AddHeader(
"Connection""Keep-Alive");
    System.Web.HttpContext.Current.Response.ContentType 
= "application/x-msdownload";
    System.Web.HttpContext.Current.Response.AddHeader(
"Content-Disposition""attachment;filename=" + System.IO.Path.GetFileName(_Path));
    System.Web.HttpContext.Current.Response.AddHeader(
"Content-Length", fstream.Length.ToString());
    
while (true)
    
{
 
//开辟缓冲区空间
 byte[] buffer = new byte[1024];
 
//读取文件的数据
 int leng = fstream.Read(buffer, 01024);
 
if (leng == 0)//到文件尾,结束
     break;
 
if (leng == 1024)//读出的文件数据长度等于缓冲区长度,直接将缓冲区数据写入
     System.Web.HttpContext.Current.Response.BinaryWrite(buffer);
 
else
 
{
     
//读出文件数据比缓冲区小,重新定义缓冲区大小,只用于读取文件的最后一个数据块
     byte[] b = new byte[leng];
     
for (int i = 0; i < leng; i++)
  b[i] 
= buffer[i];
     System.Web.HttpContext.Current.Response.BinaryWrite(b);
 }

    }

    fstream.Close();
//关闭下载文件
    System.Web.HttpContext.Current.Response.End();//结束文件下载
}

/// 下载文件第二种方法
/// <summary>
/// 下载文件
/// </summary>
/// <param name="_Path"></param>

public   static   void  DownloadFile( string  _Path)
{
    FileInfo DownloadFile 
= new FileInfo(_Path);
    System.Web.HttpContext.Current.Response.Clear();
    System.Web.HttpContext.Current.Response.ClearHeaders();
    System.Web.HttpContext.Current.Response.Buffer 
= false;
    System.Web.HttpContext.Current.Response.ContentType 
= "application/x-msdownload";
    System.Web.HttpContext.Current.Response.AppendHeader(
"Content-Disposition""attachment;filename=" + HttpUtility.UrlEncode(DownloadFile.FullName, System.Text.Encoding.UTF8));
    System.Web.HttpContext.Current.Response.AppendHeader(
"Content-Length", DownloadFile.Length.ToString());
    System.Web.HttpContext.Current.Response.WriteFile(DownloadFile.FullName);
    System.Web.HttpContext.Current.Response.Flush();
    System.Web.HttpContext.Current.Response.End();
}

// ---------------------------------->
//  System.Web.HttpContext.Current.Response
//  目的在于:可以使在类中都可以访问Response
// ---------------------------------->


/*
 * 传入参数: _DevicePath = @"C:Temp";
 
*/


/// <summary>
/// 删除文件
/// </summary>
/// <param name="_Path"></param>
/// <returns></returns>

public   static   bool  DeleteFile( string  _Path)
{
    
if (File.Exists(_Path))
    
{
 
try
 
{
     
// 如果文件存在
     
// 删除文件
     File.Delete(_Path);
 }

 
catch (System.Exception ex)
 
{
     
return false;
 }

 
return true;
    }

    
return false;
}

// ---------------------------------->
//  删除文件之前判断文件是否存在
// ---------------------------------->

 

 
文件的上传与下载的代码差不多已经可以实现了
以上的代码都可以写在一个单独的类中
在页面中调用此类的"下载文件"方法时有两种实现方式
第一种: FileUtil.DownloadFile(url);这种也是最简单的方法
第二种: 比第一种稍稍麻烦一些,需要修改文件的上传下载类
1) 使此类继承IHttpHandler接口
2) 实现IHttpHandler接口的方法:

/// <summary>
/// 使得此类被http访问的入口
/// </summary>
/// <param name="context">提供对用于为 HTTP 请求提供服务的内部服务器对象 Request、Response、Session 和 Server</param>
/// <returns></returns>

public   void  ProcessRequest(HttpContext context)
{
    
string Path = context.Server.UrlDecode(context.Request.QueryString["path"]);
    FileUtil.DownloadFileBinary(Path);
}

public   bool  IsReusable
{
    
get return true; }
}
 

配置web.config

< configuration >
   
< system .web >
      
< httpHandlers >
         
< add  verb ="*"  path ="delete.aspx"  
            type
="命名空间 + 类名, 程序域" />
      
</ httpHandlers >
   
</ system.web >
</ configuration >

调用方法

Response.Redirect( " downfile.aspx?path= "   +  _Path);

 


附加: 本人试了很多次用showModalDialog弹出的页面中好像不能使用下载功能
var __value = window.showModalDialog('Default.aspx','window','dialogwidth:450px; dialogheight:450px; center: 1; status: 0; help: 0; scroll: 0; resizable: 0;');
alert(__value);

后来实现是没办法,用window.open来实现弹出页面
window.open('Default.aspx','window','height='+iHeight+',width='+iWidth+',top='+iTop+', left='+iLeft+',toolbar=no, menubar=no, scrollbars=yes, resizable=no,location=no, status=no');
function(__value){
  alert(__value);
}

只不过返回值的时候跟showModalDialog有所不同
// showModalDialog 返回参数方法
window.returnValue = "returnValue";
// window.open 返回参数方法,调用此方法时,将及时更新返回值
window.opener.fileinsert('returnValue');

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值