web开发中,文件的上传是非常基本功能之一。
在asp.net中,通常做法是利用webservice 来接收文件请求,这样做的好处就是全站有了一个统一的文件上传接口,并且根据网站的实际情况,可以将webservice部署到其他服务器上,可以兼容考虑将来的分布存储等等问题。
 
在MVC中实现文件上传主要有2中方式:
1.普通Controller实现文件上传
2.ApiController实现文件上传
 

普通Controller实现文件上传

在普通的Controller中实现文件上传时,需要使用到HttpPostedFileBase类 来接收文件。调用HttpPostedFileBase 实例对象的SaveAs()方法,就可以将文件保存在服务器中,示例代码如下:
HTML片段:
<h2>Upload</h2>
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
<div>
<h4>Select a file:</h4>
<input name="files" id="files" type="file" />
<label id="lbError">@ViewBag.ErrorMessage</label>
<input type="submit" name="submit" value="Upload" />
</div>
}
Controller中的Action片段:
[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> files)
{
if (files == null || files.Count() == || files.ToList()[] == null)
{
ViewBag.ErrorMessage = "Please select a file!!";
return View();
}
string filePath = string.Empty;
Guid gid = Guid.NewGuid();
foreach (HttpPostedFileBase file in files)
{
filePath = Path.Combine(HttpContext.Server.MapPath("/Uploads/"), gid.ToString() + Path.GetExtension(file.FileName));
file.SaveAs(filePath);
}
return RedirectToAction("UploadResult", new { filePath = filePath });
}
public ActionResult UploadResult(string filePath)
{
ViewBag.FilePath = filePath;
return View();
}
需要注意2个问题:
1. 注意给form表单加上enctype = "multipart/form-data" 属性,否则会导致Action的参数HttpPostedFileBase 对象接收不到文件。
2. 注意文件大小,IIS中默认上传的文件大小为4MB ,超过这大小的文件需要在修改配置文件。
 
上传大文件时修改文件大小限制如下:
第一步:asp.net中的文件大小限制
<system.web>
<httpRuntime maxRequestLength="" executionTimeout="" />
</system.web>
第二步:IIS中文件大小限制
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="" />
</requestFiltering>
</security>
</system.webServer>

ApiController实现文件上传

通过ApiController来实现文件上传时,不得不参考一下 官方文档了,建议先去阅读一下。

我自己在实现Demo时, 开发环境为.net 4.0。
HTML片段:
<h2>API Upload</h2>
<form name="apiForm" method="post" enctype="multipart/form-data" action="/api/upload">
<div>
<label for="apifiles">Select a File</label>
<input name="apifiles" type="file" />
</div>
<div>
<input type="submit" value="Upload" />
</div>
</form>
ApiController代码:
public class UploadController : ApiController
{
public Task<HttpResponseMessage> PostFormData()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new Exception("");
}
string root = HttpContext.Current.Server.MapPath("/Uploads/");
var provider = new ReNameMultipartFormDataStreamProvider(root); var task = Request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
}
string fileName = string.Empty;
foreach (MultipartFileData file in provider.FileData)
{
fileName = file.LocalFileName;
}
//返回上传后的文件全路径
return new HttpResponseMessage() { Content = new StringContent(fileName) };
});
return task;
}
} /// <summary>
/// 重命名上传的文件
/// </summary>
public class ReNameMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public ReNameMultipartFormDataStreamProvider(string root)
: base(root)
{ } public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers)
{
//截取文件扩展名
string exp = Path.GetExtension(headers.ContentDisposition.FileName.TrimStart('\"').TrimEnd('\"'));
string name = base.GetLocalFileName(headers);
return name + exp;
} }

如上代码,区别与官网给出的.net 4.0 版本的代码的。

请注意: ReNameMultipartFormDataStreamProvider  为自定义类,继承自MultipartFormDataStreamProvider, 这个累的目的就是对上传上来的文件在保存到服务器时,保留文件的扩展名。MultipartFormDataStreamProvider类默认保存的文件是没有扩展名称的。当然我自己这里实现的方式的确挺土的,演示Demo明白思议即可,呵呵。
 
到这里就差不多了,后面准备实现Ajax+SingR来实现文件上传时显示上传进度的Demo。
 
参考资料:
 
Confusing required maxRequestLength and maxAllowedContentLength settings
 
关于MVC4.0 WebAPI上传图片重命名以及图文结合
 
ASP.NET Web Api Self Host大文件上传功能
 
 
 
 

MVC中的文件上传-小结的更多相关文章

  1. spring mvc中的文件上传

    使用commons-fileupload上传文件所需要的架包有:commons-fileupload 和common-io两个架包支持,可以到Apache官网下砸. 在配置文件spring-mvc.x ...

  2. 转:MVC中的文件上传

    上传文件与与上传数据区别 上传数据主要指json等简单字符串,上传文件指的是上传word.excel图片等.在上传数据的时候enctype默认为第一个application/x-www-form-ur ...

  3. ASP.NET MVC下使用文件上传

    这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3.  根目录下添加新 ...

  4. [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传

    原文 [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件 ...

  5. javaWeb中的文件上传下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. IIS 7 中设置文件上传大小的方法

    在IIS 6.0中设置文件上传大小的方法,就是配置如下节点: <system.web> <httpRuntime maxRequestLength="1918200&quo ...

  7. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)

    引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...

  8. PHP中,文件上传实例

    PHP中,文件上传一般是通过move_uploaded_file()来实现的.  bool move_uploaded_file ( string filename, string destinati ...

  9. ASP.NET中的文件上传大小限制的问题

    一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...

随机推荐

  1. ORA-01502: 索引或这类索引的分区处于不可用状态

    ORA-01502: 索引或这类索引的分区处于不可用状态 原因: 出现这个问题,可能有人move过表,或者disable 过索引.1. alter table xxxxxx move tablespa ...

  2. postgresql9.5 run 文件linux安装后配置成开机服务

    网上出现的比较多安装方法要么是源码安装,要么是yum安装,我发觉都要配置很多属性,比较麻烦,所以现在我在centos7长用 run文件来安装 http://get.enterprisedb.com/p ...

  3. (转)Zend Studio 10.6.1破解注册图文详解

    原文来自:http://www.softown.cn/soft/zend-studio/windows/10.6.1#downloads 下面我们以Zend Studio 10.6.1正式版为例来介绍 ...

  4. 2014年到期的myeclipse5.5.1注冊码

    假设点击Myeclipse的载入项目到server的图标没有反应,这就是MyEclipse过期了,下面是还能用一年的注冊码: subscriber: axin  Serial:nLR8ZC-85557 ...

  5. 【我所认知的BIOS】—&gt; uEFI AHCI Driver(4) — 第一个Protocol真难搞

    [我所认知的BIOS]-> uEFI AHCI Driver(4) - 第一个Protocol真难搞 LightSeed 4/23/2014 文章对EFI_DRIVER_BINDING_PROT ...

  6. Android-用webservice连接sqlserver数据库

    以前做的东西,只要用数据库的都是在项目里自己重新做一份数据.但是这种方法是很不可取的,首先,手机内存不会很大,把数据表建在项目里无疑又增大了程序.这样一来手机的运行速度可想而知.其次,数据大的时候还是 ...

  7. JQuery Kendo UI使用技巧总结

    Kendo UI开发总结 By Gloomyfish on 2013-04-25 在Grid中支持分页刷新:            scrollable: {virtual : true }, 在Gr ...

  8. Android-打反编译工具的一种方法

    转载请注明出处:http://blog.csdn.net/goldenfish1919/article/details/41010261 首先我们来看下dex文件的格式: class_defs的结构: ...

  9. JSP中嵌入java代码的标签方式(转)

    (1)声明变量或方法 :  <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet):  <% java代码; %> (3)表达式 ...

  10. C#中对于可变性的限制

    发现很少有集中讨论C#可变性限制的中文博文(要么就是一大段文字中夹杂很多凌乱的部分),所以写发篇博文,集中讨论,这些限制基本是基于安全考虑,亦或者根本难以实现而产生的. 注:本文不再解释什么是可变性, ...