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

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

  1、如何解决文件上传大小的限制
  2、以文件形式保存到服务器
  3、转换成二进制字节流保存到数据库以及下载方法
  4、上传Internet上的资源

  第一部分:

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

<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>

  这样上传文件的最大值就变成了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()
   {

}
/**//// <summary>
        /// 上传文件名称
        /// </summary>
        public string FileName
        {
            get
            {
                return fileName;
            }
            set
            {
                fileName = value;
            }
        }
        private string fileName;

/**//// <summary>
        /// 上传文件路径
        /// </summary>
        public string FilePath
        {
            get
            {
                return filepath;
            }
            set
            {
                filepath = value;
            }
        }
        private string filepath;

/**//// <summary>
        /// 文件扩展名
        /// </summary>
        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</Format>
    </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);

}

  这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个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
{
    /**//// <summary>
    /// NetUFile 的摘要说明。
    /// </summary>
    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上的资源到服务器。前面我们有一篇文章详细介绍了使用方法,这里我不再多说。

  第五部分:总结

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

(0)

相关推荐

  • asp.net 上传或下载当文件名包含有特殊字符"#"的处理

    如类似以下的代码: 复制代码 代码如下: Uri uri = new Uri(targetUrl);//targetUrl对应文件的绝对路径 System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.Method = "PUT"; request.Credentials = System.Net.CredentialCache.DefaultCredentials; reque

  • 拥有网页版小U盘 ASP.NET实现文件上传与下载功能

    今天看到了一篇不错的文章,就拿来一起分享一下吧. 实现的是文件的上传与下载功能. 关于文件上传: 谈及文件上传到网站上,首先我们想到的就是通过什么上传呢?在ASP.NET中,只需要用FileUpload控件即可完成,但是默认上传4M大小的数据,当然了你可以在web.config文件中进行修改,方式如下: <system.web> <httpRuntime executionTimeout="240" maxRequestLength="20480"

  • asp.net 多文件上传,兼容IE6/7/8,提供完整代码下载

    最终效果如下:现贴出核心代码如下: aspx里的代码: 复制代码 代码如下: <div style="text-align: center"> <div style="width: 200px;"> <input type="file" size="50" name="File" /> <span id="upload"></span

  • asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)

    本文实例讲述了asp.net+jquery.form实现图片异步上传的方法.分享给大家供大家参考,具体如下: 首先我们需要做准备工作: jquery 点击此处本站下载. jquery.form.js 点击此处本站下载. 页面JqueryFormTest.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="JqueryFormTest.aspx.cs" Inherits=

  • asp.net Web Services上传和下载文件(完整代码)第1/2页

    下面,我们就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器.一:通过Web Services显示和下载文件 我们这里建立的Web Services的名称为GetBinaryFile,提供两个公共方法:分别是GetImage()和GetImageType(),前者返回二进制文件字节数组,后者返回文件类型,其中,GetImage()方法有一个参数,用来在客户端选择要显示或下载的文件名字.这里我们所显示和下载的文件可以不在虚拟目录

  • .NET实现微信公共平台上传下载多媒体文件

    举个例子,有人对着我们的公共微信号拍个照片发送过来,然后我们处理这个照片,比如进行ocr识别字(随后就会降到这个例子),或者人脸识别,或者拍照取证等,这些功能都是相当有用的.那么我们现在就要分析一下这个过程.微信平台肯定不能帮助我们OCR或者人脸识别等功能,要做这些功能首先到得到图片!用户拍摄的照片首先被上传到了wenxin的服务器,然后就有了一个mediaID,我们用这个mediaID可以下载到我们自己的服务器上然后处理,把结果给微信平台,由微信平台最终反馈给用户(关注者).微信的开发文档已经

  • Flex与.NET互操作 使用FileReference+HttpHandler实现文件上传/下载

    在Flex的应用开发中,同ASP.NET,JSP,PHP等应用一样,都会有上传/下载文件的应用需求,Flex的SDK也为我们提供了专门的类 FileRefUdderence实现文件上传/下载.Flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以ASP.NET中的HttpHandler作为文件上传的服务端来完成上传功能. OK,我们从Flex客户端开始,看看客户端是通过什么方式想服务端发起请求.Flex客户端要完成文件上传下载都是通过FileRefUd

  • asp.net 上传下载输出二进制流实现代码

    复制代码 代码如下: using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls;

  • .NET实现文件跨服务器上传下载的方法

    环境说明 两台服务器服务器为A,服务器为B,服务器B为文件服务器 实现方法 1.在A和B上创建用户docshareuser,用户名和密码保持一致 2.B服务器上设置附件文件夹Attachments共享,添加用户docshareuser并设置读写权限 3.在A上运行框输入"\\IP\Attachments",输入用户名密码测试是否共享成功,共享不成功请检查网络及配置问题 4.修改AWeb.config文件附件路径节点的值 <add key="键值" value=

  • Asp.net实现MVC处理文件的上传下载功能实例教程

    上传于下载功能是程序设计中非常常见的一个功能,在ASP.NET程序开发中有着非常广泛的应用.本文就以实例形式来实现这一功能. 一.概述 如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个,而这个控件的缺席给我们带来一些小问题.这篇文章主要说如何在Asp.net MVC中上传文件,然后如何再从服务器中把上传过的文件下载下来. 二.实现方法 1.文件上传

随机推荐