本文主要介绍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使用流来上传。
这就是本文的全部内容,希望对大家的学习有所帮助。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。