[ZT] ASP.NET 关于大文件上传问题

本文介绍了ASP.NET中文件上传的多种方式,包括解决文件大小限制、上传文件到服务器及以二进制形式上传和下载文件等内容。

[ZT]http://bbs.51aspx.com/showtopic-3958-1.html

 

 

 

第一部分:

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

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

 

 

IServiceProvider Provider = (IServiceProvider)HttpContext.Current;

            HttpWorkerRequest workRequest = (HttpWorkerRequest)Provider.GetService(typeof(HttpWorkerRequest));

            byte[] bs = workRequest.GetPreloadedEntityBody();

            if (!workRequest.IsEntireEntityBodyIsPreloaded())

            {

                int n = 1024;

                byte[] bs2 = new byte[n];

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

                {

 

                }

            }

 

 

 

 

 

 

第二部分:

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

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

 

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

    <Application>

      <FileUpLoad>

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

      </FileUpLoad>

    </Application>

 

 

 

        /// <summary>

        ///

        /// </summary>

        /// <param name="InputFile">The control of 'input type='file' field.</param>

        /// <param name="filePath">Server file path.</param>

        public void UpLoadFile(HtmlInputFile InputFile, string filePath)

        {

            string fileName = InputFile.PostedFile.FileName;

            string saveName = Path.GetFileName(fileName);

 

            /* METHOD 1 */

            //HttpPostedFile postedFile = HttpContext.Current.Request.Files[0];

            //string phyPath = HttpContext.Current.Server.MapPath("./file/");

            //if (!Directory.Exists(phyPath)) Directory.CreateDirectory(phyPath);

            //postedFile.SaveAs(phyPath + saveName);

 

            /* METHOD 2 */

            HttpPostedFile postedFile = InputFile.PostedFile;

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

            postedFile.SaveAs(phyPath + fileName);

        }

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

 

第三部分:

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

 

        public byte[] UpLoadFile(HtmlInputFile file)

        {

            HttpPostedFile upFile = file.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 这个类里的方法,具体实现如下:

 

    public class OpenFile : IHttpHandler

    {

        public void ProcessRequest(HttpContext context)

        {

 

            DataSet ds = new DataSet();

            DataTable dt = ds.Tables[0];

            DataRow drow = dt.Rows[0];

            context.Response.Buffer = true;

            context.Response.Clear();

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

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

            context.Response.BinaryWrite((Byte[])drow["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上读取文件,因此可以很好的解决这个问题。

【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值