分享
 
 
 

ASP.NET中文件上传下载方法集合

王朝asp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:

1、如何解决文件上传大小的限制

2、以文件形式保存到服务器

3、转换成二进制字节流保存到数据库以及下载方法

4、上传Internet上的资源

第一部分:

首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下:

这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下:

IServiceProvidERProvider=(IServiceProvider)HttpContext.Current;

HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));

byte[]bs=wr.GetPreloadedEntityBody();

.

if(!wr.IsEntireEntityBodyIsPreloaded())

{

intn=1024;

byte[]bs2=newbyte[n];

while(wr.ReadEntityBody(bs2,n)>0)

{

..

}

}

这样就可以解决了大文件的上传问题了。

第二部分:

下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。

首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。

public class FileUpLoad

{

public FileUpLoad()

{}

/**////

/// 上传文件名称

///

public string FileName

{

get

{

return fileName;

}

set

{

fileName = value;

}

}

private string fileName;

/**////

/// 上传文件路径

///

public string FilePath

{

get

{

return filepath;

}

set

{

filepath = value;

}

}

private string filepath;

/**////

/// 文件扩展名

///

public string FileExtension

{

get

{

return fileExtension;

}

set

{

fileExtension = value;

}

}

private string fileExtension;

}

另外我们还可以在配置文件中限制上传文件的格式(App.Config):

<?XML version="1.0" encoding="gb2312" ?>

<Application>

<FileUpLoad>

<Format>.jpg|.gif|.png|.bmp

</FileUpLoad>

</Application>

这样我们就可以开始写我们的上传文件的方法了,如下:

public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom)

{

FileUpLoad fp = new FileUpLoad();

string fileName,fileExtension;

string saveName;

//

//建立上传对象

//

HttpPostedFile postedFile = InputFile.PostedFile;

fileName = System.IO.Path.GetFileName(postedFile.FileName);

fileExtension = System.IO.Path.GetExtension(fileName);

//

//根据类型确定文件格式

//

AppConfig app = new AppConfig();

string format = app.GetPath("FileUpLoad/Format");

//

//如果格式都不符合则返回

//

if(format.IndexOf(fileExtension)==-1)

{

throw new ApplicationException("上传数据格式不合法");

}

//

//根据日期和随机数生成随机的文件名

//

if(myfileName != string.Empty)

{

fileName = myfileName;

}

if(isRandom)

{

Random objRand = new Random();

System.DateTime date = DateTime.Now;

//生成随机文件名

saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100);

fileName = saveName + fileExtension;

}

string phyPath = HttpContext.Current.Request.MapPath(filePath);

//判断路径是否存在,若不存在则创建路径

DirectoryInfo upDir = new DirectoryInfo(phyPath);

if(!upDir.Exists)

{

upDir.Create();

}

//

//保存文件

//

try

{

postedFile.SaveAs(phyPath + fileName);

fp.FilePath = filePath + fileName;

fp.FileExtension = fileExtension;

fp.FileName = fileName;

}

catch

{

throw new ApplicationException("上传失败!");

}

//返回上传文件的信息

return fp;

}

然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。

第三部分:

这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:

public byte[] UpLoadFile(HtmlInputFile f_IFile)

{

//获取由客户端指定的上传文件的访问

HttpPostedFile upFile=f_IFile.PostedFile;

//得到上传文件的长度

int upFileLength=upFile.ContentLength;

//得到上传文件的客户端MIME类型

string contentType = upFile.ContentType;

byte[] FileArray=new Byte[upFileLength];

Stream fileStream=upFile.InputStream;

fileStream.Read(FileArray,0,upFileLength);

return FileArray;

}

这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个 aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:

首先,在Web.config中加入:

<add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>

这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:

using System;

using System.Data;

using System.Web;

using System.IO;

using Ruixin.WorkFlowDB;

using RXSuite.Base;

using RXSuite.Component;

using RuixinOA.BusinessFacade;

namespace RuixinOA.Web.BaseClass

{

/**////

/// NetUFile 的摘要说明。

///

public class OpenFile : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

//从数据库中取出要下载的文件信息

RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager();

EntityData data = os.GetFileDetail(id);

if(data != null && data.Tables["RX_OA_File"].Rows.Count >0)

{

DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0];

context.Response.Buffer = true;

context.Response.Clear();

context.Response.ContentType = dr["CContentType"].ToString();

context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString()));

context.Response.BinaryWrite((Byte[])dr["CContent"]);

context.Response.Flush();

context.Response.End();

}

}

public bool IsReusable

{

get { return true;}

}

}

}

执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。

第四部分:

这一部分主要说如何上传一个Internet上的资源到服务器。

首先需要引用 System.Net 这个命名空间,然后操作如下:

HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");

HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse();

byte[] bytes = new byte[hwr.ContentLength];

Stream stream = hwr.GetResponseStream();

stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));

//HttpContext.Current.Response.BinaryWrite(bytes);

HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。

第五部分:总结

今天简单的介绍了几种文件上传与下载的方法,都是在实际的项目开发中经常需要用到的,可能还有不完善的地方,希望大家可以互相交流一下项目开发中的经验。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有