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)  
 {  
  ..  
 }  
}    
这样就可以解决了大文件的上传问题了。

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

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

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  
{  
 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上读取文件,因此可以很好的解决这个问题。

时间: 2024-10-07 14:28:47

C#大文件上传(转--待验证)的相关文章

SpringMVC中文件上传的客户端验证

SpringMVC中文件上传的客户端验证 客户端验证主要思想:在jsp页面中利用javascript进行对文件的判断,完成验证后允许上传 验证步骤:1.文件名称 2.获取文件的后缀名称 3.判断哪些文件类型允许上传 4.判断文件大小 5.满足条件后跳转后台实现上传 前台界面(验证上传文件是否格式满足要求): <body> <h2>文件上传</h2> <form action="upload01" method="post" 

java 大文件上传 断点续传 完整版实例 (Socket、IO流)

原文出自:https://blog.csdn.net/seesun2012 java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操作 2.服:使用ServerSocket.accept()方法进行阻塞,接收客户端请求 3.服:每接收到一个Socket就建立一个新的线程来处理它 4.客:利用Socket进行远程连接,询问已上传进度 5.客:使用File

JS大文件上传解决方案

1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器,做一层中转便可以实现,但当这份文件非常大到了10GB级别,我们就需要思考另一种形式的技术方案了,也就是本文要阐述的方案. 技术要求主要有以下几方面: 支持超大数据量.10G级别以上 稳定性:除网络异常情况100%成功 准确性:数据无丢失,读写准确性100% 效率:1G文件分钟级

web大文件上传解决方案支持分片断点上传

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览

网页大文件上传解决方案支持分片断点上传

1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器,做一层中转便可以实现,但当这份文件非常大到了10GB级别,我们就需要思考另一种形式的技术方案了,也就是本文要阐述的方案. 技术要求主要有以下几方面: 支持超大数据量.10G级别以上 稳定性:除网络异常情况100%成功 准确性:数据无丢失,读写准确性100% 效率:1G文件分钟级

JavaScript大文件上传解决方案实例代码

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览

面试官:请你实现一个大文件上传和断点续传

前言这段时间面试官都挺忙的,频频出现在博客文章标题,虽然我不是特别想蹭热度,但是实在想不到好的标题了-.-,蹭蹭就蹭蹭 :) 事实上我在面试的时候确实被问到了这个问题,而且是一道在线 coding 的编程题,当时虽然思路正确,可惜最终也并不算完全答对 结束后花了一段时间整理了下思路,那么究竟该如何实现一个大文件上传,以及在上传中如何实现断点续传的功能呢? 本文将从零搭建前端和服务端,实现一个大文件上传和断点续传的 demo 文章有误解的地方,欢迎指出,将在第一时间改正,有更好的实现方式希望留下你

局域网 批量大文件上传下载

1 背景 用户本地有一份txt或者csv文件,无论是从业务数据库导出.还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工.挖掘和共创应用的时候,首先要将本地文件上传至ODPS,普通的小文件通过浏览器上传至服务器,做一层中转便可以实现,但当这份文件非常大到了10GB级别,我们就需要思考另一种形式的技术方案了,也就是本文要阐述的方案. 技术要求主要有以下几方面: 支持超大数据量.10G级别以上 稳定性:除网络异常情况100%成功 准确性:数据无丢失,读写准确性100% 效率:1G文件分钟级

基于Nodejs的大文件上传之断点续传

接着<扒一扒Nodejs formidable的onPart>和<也说文件上传之兼容IE789的进度条---丢掉flash>:前面已完成兼容IE789的大文件上传:无flash的低版本进度条,高版本的分段上传,并已为断点续传做好铺垫: 说什么做好铺垫,原本以为Nodejs端已没问题,只剩前端依靠HTML5接着监听abort事件,保存中断时上传到第几块了(断点续传只支持文件比较大,然后意外上传中断了,暂时定50M开启断点续传吧),通过文件内容hash和该文件唯一上传token来记录断