asp.net(C#)中上传大文件的几中常见应用方法

作者&投稿:弭琬 (若有异议请与网页底部的电邮联系)
~

几种常见的方法,本文主要内容包括:

第一部分:首先我们来说一下如何解决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)
{
..
}
}
这样就可以解决了大文件的上传问题了。

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

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

publicclassFileUpLoad
{
publicFileUpLoad()
{}
///上传文件名称
publicstringFileName
{
get
{
returnfileName;
}
set
{
fileName=value;
}
}
privatestringfileName;
///上传文件路径
publicstringFilePath
{
get
{
returnfilepath;
}
set
{
filepath=value;
}
}
privatestringfilepath;

///文件扩展名
publicstringFileExtension
{
get
{
returnfileExtension;
}
set
{
fileExtension=value;
}
}
privatestringfileExtension;
}

另外我们还可以在配置文件中限制上传文件的格式(App.Config):
<?XMLversion="1.0"encoding="gb2312"?>
<Application>
<FileUpLoad>
<Format>.jpg|.gif|.png|.bmp
</FileUpLoad>
</Application>这样我们就可以开始写我们的上传文件的方法了,如下:publicFileUpLoadUpLoadFile(HtmlInputFileInputFile,stringfilePath,stringmyfileName,boolisRandom)
{
FileUpLoadfp=newFileUpLoad();
stringfileName,fileExtension;
stringsaveName;
//建立上传对象
HttpPostedFilepostedFile=InputFile.PostedFile;

fileName=System.IO.Path.GetFileName(postedFile.FileName);
fileExtension=System.IO.Path.GetExtension(fileName);
//根据类型确定文件格式
AppConfigapp=newAppConfig();
stringformat=app.GetPath("FileUpLoad/Format");
//如果格式都不符合则返回
if(format.IndexOf(fileExtension)==-1)
{
thrownewApplicationException("上传数据格式不合法");
}

//
//根据日期和随机数生成随机的文件名
//
if(myfileName!=string.Empty)
{
fileName=myfileName;
}

if(isRandom)
{
RandomobjRand=newRandom();
System.DateTimedate=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;
}

stringphyPath=HttpContext.Current.Request.MapPath(filePath);

//判断路径是否存在,若不存在则创建路径
DirectoryInfoupDir=newDirectoryInfo(phyPath);
if(!upDir.Exists)
{
upDir.Create();
}
//保存文件
try
{
postedFile.SaveAs(phyPath+fileName);

fp.FilePath=filePath+fileName;
fp.FileExtension=fileExtension;
fp.FileName=fileName;
}
catch
{
thrownewApplicationException("上传失败!");
}

//返回上传文件的信息
returnfp;
}

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

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

publicbyte[]UpLoadFile(HtmlInputFilef_IFile)
{
//获取由客户端指定的上传文件的访问
HttpPostedFileupFile=f_IFile.PostedFile;
//得到上传文件的长度
intupFileLength=upFile.ContentLength;
//得到上传文件的客户端MIME类型
stringcontentType=upFile.ContentType;
byte[]FileArray=newByte[upFileLength];

StreamfileStream=upFile.InputStream;

fileStream.Read(FileArray,0,upFileLength);
returnFileArray;
}

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

首先,在Web.config中加入:<addverb="*"path="openfile.aspx"type="RuixinOA.Web.BaseClass.OpenFile,RuixinOA.Web"/>这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile这个类里的方法,具体实现如下:

usingSystem;
usingSystem.Data;
usingSystem.Web;
usingSystem.IO;
usingRuixin.WorkFlowDB;
usingRXSuite.Base;
usingRXSuite.Component;
usingRuixinOA.BusinessFacade;

namespaceRuixinOA.Web.BaseClass
{
publicclassOpenFile:IHttpHandler
{
publicvoidProcessRequest(HttpContextcontext)
{
//从数据库中取出要下载的文件信息
RuixinOA.BusinessFacade.RX_OA_FileManageros=newRX_OA_FileManager();
EntityDatadata=os.GetFileDetail(id);

if(data!=null&&data.Tables["RX_OA_File"].Rows.Count>0)
{
DataRowdr=(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();
}
}
publicboolIsReusable
{
get{returntrue;}
}
}
}

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

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

首先需要引用System.Net这个命名空间,然后操作如下:HttpWebRequesthwq=(HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx");
HttpWebResponsehwr=(HttpWebResponse)hwq.GetResponse();
byte[]bytes=newbyte[hwr.ContentLength];
Streamstream=hwr.GetResponseStream();
stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength));
//HttpContext.Current.Response.BinaryWrite(bytes);

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





asp.net是什么?
ASP.NET又称为ASP+,不仅仅是ASP的简单升级,而是微软公司推出的新一代脚本语言。ASP.NET基于.NET Framework的Web开发平台,不但吸收了ASP以前版本的最大优点并参照Java、VB语言的开发优势加入了许多新的特色,同时也修正了以前的ASP版本的运行错误。ASP.NET就是属于WebForm,也就是平时说的B\/S模式的...

电信SP是什么
SP,Service Provider服务提供商的简称 。电信增值业务是指凭借公用电信网的资源和其它通信设备而开发的附加通信业务,其实现的价值使原有网路的经济效益或功能价值增高。有时称之为增强型业务。增值业务广义上分成两大类:一是以增值网(VAN)方式出现的业务。增值网可凭借从公用网租用的传输设备,使用本...

unknown software exception(0xc000000d),位置为0x00459558
unknown software exception (0x*00000**),位置为0x0***0 这个问题大多是杀毒残留,但也有可能是你卸载某个软件不正确留下的注册表残留。杀毒后,病毒被删除,但启动项里相关加载设置还在,解决方法就是以下方法,如果找不到那个加载失败的启动项就可能是做了伪装,具体伪装到哪个启动项需要分析系统环境...

我的电脑开机会出现:“应用程序无法正常启动(0xc0000005)。请单击确...
14 杀毒软件与系统或软件相冲突 由于杀毒软件是进入底层监控系统的,可能与一些软件相冲突,卸载试试 15 系统本身有问题 有时候操作系统本身也会有BUG,要注意安装官方发行的更新程序,象SP的补丁,最好打上.如果还不行,重装系统,或更换其他版本的系统。 在控制面板的添加\/删除程序中看看你是否安装了微软NE...

程序初始化(0xc0000005)错误
应用程序正常初始化(0xc0000005)失败,是因为我们Windowsupdate服务未正常启动导致。解决方法如下:1.首先呢,打开我们的电脑,按下键盘上的win+R组合键打开运行窗口。2.输入“服务。msc”在运行窗口的输入框中,不包括引号,然后按回车键打开服务接口。3.在所有服务的列表中,双击Windows更新服务。此...

...setup requires the.NET Framework 3.5 SP 1 to be installed._百度...
此句话中文意思:在执行这一步安装之前,首先需要安装“.NET Framework 3.5 sp1”.P.S., “.NET Framework 3.5 sp1”由微软提供,有些软件需要首先安装它才能正常使用,可以在微软的官方网站上找到它的安装包。官方下载地址,[ http:\/\/www.microsoft.com\/downloads\/details.aspx?FamilyID=333325fd...

ex7c939fca″指令引用的″0x00000010″内存,该内存不能为written_百度知...
键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98\/Me”。win2000如果打了SP的补丁后 ,只要开始,运行,输入:regsvr32 c:\\winnt\\apppatch\\slayerui.dll。右键,属性,也会出现兼容性的选项。 例三:RealOne Gold关闭时出现错误,以前一直使用正常,...

应用程序发生异常(0xcoooo409)位置为0x7c93428a
运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellExecuteHooks下,应该只有一个正常的键值"{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。〔我个人的最后解决和看法〕我今天尝试了多种办法,最后我发现问题出在微软的NET.Framework上面。我...

谁有关于手机(除*#06#外)的一些代码呀?
再按C 波导8xx,9xx的万能密码:*#+imei7-14#, 三菱 Net Lock:*787090 或 *787292 IMSI Lock:*362628 或 *360608 NetSub Lock:*476989 CP Lock:*482896 或 *480896 SP Lock:*967678 Ext Lock:*574243 飞利浦手机的秘籍:Philips DIGA 和 GENIE 输入 *#7489 *# 可以看到密码,Philips FIZZ 输入 *...

Windows7如何安装Microsoft.NET Framework 4.0?
netfx.msi targetdir=c:\\dotnet"当弹出对话框提安装完成时点“确定”第二步 dotnetfxsp1.exe \/xp:c:\\dotnet\\netfxsp.msp 第三步 msiexec.exe \/a c:\\dotnet\\netfx.msi \/p c:\\dotnet\\netfxsp.msp 等待,完成后相关对话框会自动消失 8,运行文件夹里的netfx.msi 此时.net framework1.1已经...

西盟佤族自治县15977334371: asp.net(c#)如何上传大文件? -
左和盐酸: 想要想上传大文件,必须在web.config文件中进行配置.在节点中添加如下代码即可:这个代码就是表示设置最大请求值,上传文件也就相当于请求.maxRequestLength单位为KB,最大值为:2097151.如果不设置,默认为4096 KB (4 MB).也就是说上传的文件最大可以上传2G以内的文件.一般没有配置的话,默认只能上传4M以内的文件.配置了的话就可以上传更大的文件.

西盟佤族自治县15977334371: asp.net c#写一个上传文件的功能.当上传超过4M的文件时页面就会报错说:超过了最大请求长度.该怎么修改 -
左和盐酸: Web.config 里面 但是这个上传功能很有限,受制于网络环境影响,比如性我这个设置,可以上传200M,但实际在局域网内只能是几十M,如果是一般的网络,也就只能几兆了.这是因为虽然这个不限制了,但是网站还有个超时限制,比如90秒,你家里网络100K/s的话,你最大只能是9M,实际中就更小了.所以对于大文件上传,最好使用组件或是自己写组件,我没有下载到好组件,自己又懒得没写.

西盟佤族自治县15977334371: ASP.NET中上传几百兆的大文件
左和盐酸: 在web.config文件中<system.web>节点下设置上传大小: <httpRuntime maxRequestLength="4096" /> maxRequestLength为可上传的大小(kb) ASP.NET自带有上传控件.

西盟佤族自治县15977334371: asp.net文件上传最大限制是多少 -
左和盐酸: 对于asp.net,默认只允许上传2M文件,在web.config增加如下配置,一般可以自定义最大文件大小. <httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/> 其中maxRequestLength属性就是限制上传大小的,如设为"40960"即为40M

西盟佤族自治县15977334371: 如何实现asp.net上传超大文件并且能够供客户在网页上直接浏览该内容?
左和盐酸: 上传一个超大文件,如几百M的,则不能通过http上传.通常都是开发一个activex控件,自己开发socket传输程序.至于浏览是很简单的,就不说了.

西盟佤族自治县15977334371: asp.net(c#)后台图片批量上传的限制,比如从5M修改为10M. -
左和盐酸: 上传大文件,Web.config中的配置 :在web.config中的内加入如下代码: httpRuntime是配置asp.net http运行时设置,以确定如何处理对asp.net应用程序的请求. executionTimeout:表示允许执行请求的最大时间限制,单位为秒 ...

西盟佤族自治县15977334371: 请问,如何用ASP+C#实现上传附件的功能 -
左和盐酸: 你可以去www.csdn.net查阅相关资料 以下是我工作中做的2个方法,可以实现不知道你能不能看懂 private void upfile_ServerClick(object sender, System.EventArgs e) { if(File1.PostedFile.FileName.Trim()!="") { //文件扩展名 string filename=...

西盟佤族自治县15977334371: ASP.Net如何用FileUpLoad实现多文件上传 -
左和盐酸: 给你些建议哦:1.多文件上传没有必要动态添加FileUpLoad,因为这种工作并没有带来多大的收益,因为你完全可以放置4个到5个FileUpLoad控件,用户上传一般不会很多,假如超过5个也可以分多次上传.2.如果想动态添加,你首先要判断用...

西盟佤族自治县15977334371: ASP.NET不能上传大文件,怎么办 -
左和盐酸: 在之间加,这里是字节数.不过这个方法,用处不大,建议使用大文件上传组件

西盟佤族自治县15977334371: C# ASP.NET 使用 FileUpload如何判断要上传文件大小 -
左和盐酸: trypublic static long GetRemoteHTTPFileSize(string sURL){long size = 0L;try{System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(sURL);request.Method = "HEAD";System.Net....

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网