ASP.NET MVC 文件上传教程(一

ASP.NETMVC文件上传教程(一)

本文主要介绍ASP第一教程。NETMVC文件上传详细说明。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

在本节中,我们将讨论如何在MVC中上传文件。我们再深入了解一下。

Upload File(一)

我们在默认创建的项目中的主控制器下添加以下内容:

公共操作结果上传文件()

{

return View();

}

[HttpPost]

公共操作结果上传文件(HttpPostedFileBase文件)

{

var fileName=file。文件名;

var filePath=Server。MapPath(字符串。Format(~/{0} , File );

文件。另存为(路径。Combine(文件路径,文件名));

return View();

}

将以下内容添加到UploadFile视图中:

form action=/Home/upload file method= post enctype= multipart/form-data

输入类型=文件名称=文件/br /

输入=提交值=提交/

/表单

关于观点我们不必多说,只需理解以下两点:

(1)后台使用HttpPostedFileBase接收上传的文件。这个类是一个抽象类,但是在ASP.NET Web表单中没有这样的类。这个类是为了更好的单元测试而出现的。

(2)视图中文件类型的名称应与后台接收到的文件的参数一致。

接下来,让我们演示并看看结果:

我们只是上传了一个Excel文件。接下来,我们通过强类型视图和模型验证来加强上传。

Upload File(二)

我们创建以下BlogModel类:

公共类BlogModel

{

[Display(Name=博客名称)]

[必填(ErrorMessage=请输入您的博客名称!)]

公共字符串BlogName { get设置;}

[Display(Name=博客地址)]

[必填(ErrorMessage=请输入您的博客地址!)]

公共字符串BlogAddress { get设置;}

[Display(Name=博客图片)]

[必填(ErrorMessage=请上传您的博客图片!)]

[验证文件]

public httpostedfilebase blog photo { get;设置;}

}

上述文件的特征尚未验证,只能定制文件特征,如下:

公共类ValidateFileAttribute:validation attribute

{

公共覆盖bool IsValid(对象值)

{

int MaxContentLength=1024 * 1024 * 4;

string[]allowed file extensions=new string[]{ 。jpg ,。gif ,。png ,。pdf };

var file=值为HttpPostedFileBase

if (file==null)

返回false

else if(!AllowedFileExtensions。包含(文件。FileName.Substring(文件。FileName.LastIndexOf( . ))))

{

Error=请上传您的博客图片类型: string.join(,,allowedFileExtensions);

返回false

}

else if(文件。ContentLength MaxContentLength)

{

错误=上传的图片太大,不能超过4兆:(maxcontentlength/1024)。tostring()“MB”;

返回false

}

其他

返回true

}

}

我们可以任意设置上传文件的大小。我们将其设置为40兆字节。在配置文件中,我们知道maxRequestLength=4096默认为4兆字节。当然,我们可以改变它的默认设置。

httpRuntime target framework= 4.5 execution time out= 1100 maxRequestLength= 40960 /

此时,我们在控制器中修改上面的上传方法:

[HttpPost]

公共操作结果上传文件(BlogModel bModel)

{

if (ModelState。IsValid)

{

var fileName=bModel。BlogPhoto .文件名;

var filePath=Server。MapPath(字符串。Format(~/{0} , File );

bModel。BlogPhoto.SaveAs(路径。Combine(文件路径,文件名));

模型状态。clear();

}

return View();

}

接下来我们来看看效果:

发生了什么事?有点不对劲。我们的文件似乎太大了。看了一下,将近45兆,但是我们设为40兆。所以我们继续修改配置文件中的文件大小,但结果还是一样。我们继续仔细看看这个结果的提示,根据提示找到配置文件下的节点,再试一次。我们在syste.webServer节点下将其设置为2G:

安全

请求过滤

request limits maxAllowedContentLength= 2147483647

/requestLimits

/请求过滤

/安全性

结果就好使了,查了查也有遇到类似问题的人,貌似只有给个结果,却没有给解释,为什么在httpRuntime中设置不行,但是有些这样设置是正确的,这是什么原因?最终找到了答案:

(1)在IIS 5和IIS 6中,默认文件上传的最大为四兆,当上传的文件大小超过四兆时,则会得到错误信息,但是我们通过如下来设置文件大小。

system.web

httpRuntime maxRequestLength= 2147483647 执行超时= 100000 /

/system.web

(2)在IIS 7中,默认文件上传的最大为28.6兆,当超过其默认设置大小,同样会得到错误信息,但是我们却可以通过如下来设置文件上传大小。

system.webServer

安全

请求过滤

请求限制maxAllowedContentLength= 2147483647 /

/请求过滤

/安全性

/system.webServer

【类推的话,个人觉得可能是在IIS 7以上都是通过如上述IIS 7来设置文件上传大小】

虽然我们在服务器端对其进行验证,但是我们觉得这样还是不能保险,我们继续在客户端对其上传的图片类型和大小进行验证。

(1)利用强类型视图给出视图代码:

style type=text/css 。字段验证错误{

颜色:红色;

}

/风格

form id= upload file sub action=/Home/upload file method= post enctype= multipart/form-data

字段集

传奇/传奇

ul class=lifile

@Html .LabelFor(m=m.BlogName)br /

@Html .TextBoxFor(m=m.BlogName,new { maxlength=50 })

@Html .(m=m . BlogName)的验证消息

/李

@Html .LabelFor(m=m.BlogAddress)br /

@Html .TextBoxFor(m=m.BlogAddress,new { maxlength=200 })

@Html .(m=m .博客地址)的验证消息br/

/李

@Html .LabelFor(m=m.BlogPhoto)

@Html .TextBoxFor(m=m.BlogPhoto,new { type=file })

@Html .(m=m .博客照片)的验证消息

span id= warning style= color:red;字号:大;/span

/李

输入类型=提交值=提交 /

/李

/ul

/字段集

/表单

(2)利用脚本获取上传文件大小:

函数GetFileSize(fileid) {

定义变量文件大小=0;

fileSize=$(# fileid)[0].文件[0]。尺寸;

fileSize=fileSize/1048576;

返回文件大小;

}

(3)根据上传的路径获取文件名称:

函数getNameFromPath(strFilepath) {

var objRE=新regexp(/([^/])$/);

var strName=objre。exec(strfile路径);

if (strName==null) {

返回空

}

否则{

返回strName[0];

}

}

(4)当更换文件时触发Change事件对其文件类型和文件大小进行验证:

$(#BlogPhoto ).change(function () {

var file=getNameFromPath($(this).val());

如果(文件!=null) {

定义变量误差=$(文档)。查找(。字段-验证-错误);

$.每个(错误,函数(k,v) {

if ($(v).attr( data-valmsg-for )===博客照片){

$(五)。hide();

}

});

var扩展名=文件。substr((文件。lastindexof( . )) 1));

开关(分机){

案例“jpg”:

案例"巴布亚新几内亚":

案例“gif”:

案例 pdf :

fileTypeBool=false

打破;

默认值:

fileTypeBool=true

}

}

if (fileTypeBool) {

$(#warning ).html(只能上传扩展名为jpg、png、gif、pdf的文件!);

返回错误的

}

否则{

var size=get filesize(博客照片);

如果(尺寸4) {

fileSizeBool=true

$(#warning ).html(上传文件已经超过四兆!);

}否则{

fileSizeBool=false

}

}

});

(5)当点击提交按钮时对其进行文件进行验证:

$(#uploadFileSub ).提交(函数(){

$(input[type=text]).每个(函数(k,v) {

if ($(v).长度){

$(五)。兄弟姐妹( span ).hide();

}

});

if(文件类型bool | |文件大小bool){

返回错误的

}

});

【注意】

上述对于验证不是太完整,但是基本的架子已经给出。

接下来我们来完整的演示整个过程。

上述我们一直是利用的纯超文本标记语言代码,当然也可以利用手动音量调节的扩展方法来进行,如下(最终渲染的还是表单,本质上是一致的,就不做过多探讨了)

@使用(Html .BeginForm(UploadFile , Home ,FormMethod .Post,new { enctype= multipart/form-data }))

{

输入类型=文件 id=文件名称=文件/

输入=提交值=提交/

}

结语

本节我们详细描述了如何在MVC中上传文件,但是有一点我们没有提到,那就是我们使用streams将上面提到的图片转换成字节并插入数据库。

上传请参考本文。NET使用流来上传。

这就是本文的全部内容,希望对大家的学习有所帮助。

ASP.NET MVC 文件上传教程(一