本文主要介绍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使用流来上传。
这就是本文的全部内容,希望对大家的学习有所帮助。