文件的上传下载是我们在实际项目开发过程中经常需要用到的技术这里给出几种常见的方法本文主要内容包括
如何解决文件上传大小的限制
以文件形式保存到服务器
转换成二进制字节流保存到数据库以及下载方法
上传Internet上的资源
第一部分
首先我们来说一下如何解决中的文件上传大小限制的问题我们知道在默认情况下ASPNET的文件上传大小限制为M一般情况下我们可以采用更改WebConfig文件来自定义最大文件大小如下
这样上传文件的最大值就变成了M但这样并不能让我们无限的扩大 MaxRequestLength的值因为ASPNET会将全部文件载入内存后再加以处理解决的方法是利用隐含的 HttpWorkerRequest用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASPNET 建立的pipe里分块读取数据实现方法如下
IServiceProvidERProvider=(IServiceProvider)HttpContextCurrent;
HttpWorkerRequestwr=(HttpWorkerRequest)providerGetService(typeof(HttpWorkerRequest));
byte[]bs=wrGetPreloadedEntityBody();
if(!wrIsEntireEntityBodyIsPreloaded())
{
intn=;
byte[]bs=newbyte[n];
while(wrReadEntityBody(bsn)>)
{
}
}
这样就可以解决了大文件的上传问题了
第二部分
下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息
首先我们定义一个类用来存储上传的文件的信息(返回时需要)
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;
}
另外我们还可以在配置文件中限制上传文件的格式(AppConfig)
<?XML version= encoding=gb ?>
<Application>
<FileUpLoad>
<Format>jpg|gif|png|bmp
</FileUpLoad>
</Application>
这样我们就可以开始写我们的上传文件的方法了如下
public FileUpLoad UpLoadFile(HtmlInputFile InputFilestring filePathstring myfileNamebool isRandom)
{
FileUpLoad fp = new FileUpLoad();
string fileNamefileExtension;
string saveName;
//
//建立上传对象
//
HttpPostedFile postedFile = InputFilePostedFile;
fileName = SystemIOPathGetFileName(postedFileFileName);
fileExtension = SystemIOPathGetExtension(fileName);
//
//根据类型确定文件格式
//
AppConfig app = new AppConfig();
string format = appGetPath(FileUpLoad/Format);
//
//如果格式都不符合则返回
//
if(formatIndexOf(fileExtension)==)
{
throw new ApplicationException(上传数据格式不合法);
}
//
//根据日期和随机数生成随机的文件名
//
if(myfileName != stringEmpty)
{
fileName = myfileName;
}
if(isRandom)
{
Random objRand = new Random();
SystemDateTime date = DateTimeNow;
//生成随机文件名
saveName = dateYearToString() + dateMonthToString() + dateDayToString() + dateHourToString() + dateMinuteToString() + dateSecondToString() + ConvertToString(objRandNext()* + );
fileName = saveName + fileExtension;
}
string phyPath = HttpContextCurrentRequestMapPath(filePath);
//判断路径是否存在若不存在则创建路径
DirectoryInfo upDir = new DirectoryInfo(phyPath);
if(!upDirExists)
{
upDirCreate();
}
//
//保存文件
//
try
{
postedFileSaveAs(phyPath + fileName);
fpFilePath = filePath + fileName;
fpFileExtension = fileExtension;
fpFileName = fileName;
}
catch
{
throw new ApplicationException(上传失败!);
}
//返回上传文件的信息
return fp;
}
然后我们在上传文件的时候就可以调用这个方法了将返回的文件信息保存到数据库中至于下载就直接打开那个路径就OK了
第三部分
这里我们主要说一下如何以二进制的形式上传文件以及下载首先说上传方法如下
public byte[] UpLoadFile(HtmlInputFile f_IFile)
{
//获取由客户端指定的上传文件的访问
HttpPostedFile upFile=f_IFilePostedFile;
//得到上传文件的长度
int upFileLength=upFileContentLength;
//得到上传文件的客户端MIME类型
string contentType = upFileContentType;
byte[] FileArray=new Byte[upFileLength];
Stream fileStream=upFileInputStream;
fileStreamRead(FileArrayupFileLength);
return FileArray;
}
这个方法返回的就是上传的文件的二进制字节流这样我们就可以将它保存到数据库了下面说一下这种形式的下载也许你会想到这种方式的下载就是新建一个 aspx页面然后在它的Page_Load()事件里取出二进制字节流然后再读出来就可以了其实这种方法是不可取的在实际的运用中也许会出现无法打开某站点的错误我一般采用下面的方法
首先在nfig中加入
<add verb=* path=openfileaspx type=RuixinOAWebBaseClassOpenFile RuixinOAWeb/>
这表示我打开openfileaspx这个页面时系统就会自动转到执行RuixinOAWebBaseClassOpenFile 这个类里的方法具体实现如下
using System;
using SystemData;
using SystemWeb;
using SystemIO;
using RuixinWorkFlowDB;
using RXSuiteBase;
using RXSuiteComponent;
using RuixinOABusinessFacade;
namespace RuixinOAWebBaseClass
{
/**//// /// NetUFile 的摘要说明
///
public class OpenFile : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//从数据库中取出要下载的文件信息
RuixinOABusinessFacadeRX_OA_FileManager os = new RX_OA_FileManager();
EntityData data = osGetFileDetail(id);
if(data != null && dataTables[RX_OA_File]RowsCount >)
{
DataRow dr = (DataRow)dataTables[RX_OA_File]Rows[];
contextResponseBuffer = true;
contextResponseClear();
contextResponseContentType = dr[CContentType]ToString();
contextResponseAddHeader(ContentDispositionattachment;filename= + HttpUtilityUrlEncode(dr[CTitle]ToString()));
contextResponseBinaryWrite((Byte[])dr[CContent]);
contextResponseFlush();
contextResponseEnd();
}
}
public bool IsReusable
{
get { return true;}
}
}
}
执行上面的方法后系统会提示用户选择直接打开还是下载这一部分我们就说到这里
第四部分
这一部分主要说如何上传一个Internet上的资源到服务器
首先需要引用 SystemNet 这个命名空间然后操作如下
HttpWebRequest hwq = (HttpWebRequest)WebRequestCreate(x);
HttpWebResponse hwr = (HttpWebResponse)hwqGetResponse();
byte[] bytes = new byte[hwrContentLength];
Stream stream = hwrGetResponseStream();
streamRead(bytesConvertToInt(hwrContentLength));
//HttpContextCurrentResponseBinaryWrite(bytes);
HttpWebRequest 可以从Internet上读取文件因此可以很好的解决这个问题
第五部分总结
今天简单的介绍了几种文件上传与下载的方法都是在实际的项目开发中经常需要用到的可能还有不完善的地方希望大家可以互相交流一下项目开发中的经验