Asp.net mvc 3 file uploads using the fileapi
Asp.net mvc 3 file uploads using the fileapi
I was recently given the task of adding upload progress bars to some internal applications. A quick search of the internet yielded SwfUpload. Which worked…but not in the way that I wanted. So I went the route of using the new FileApi. It didn’t function the way that I’ve been used to standard file uploads. This is how I made it work in MVC3.
Setup
First let’s just setup a basic upload form so that we have one that works in almost every browser.
@using(Html.BeginForm("uploadfile","home",FormMethod.Post,new{ enctype ="multipart/form-data"})){<input id="files-to-upload" type="file" name="file"/><input type='submit' id='upload-files' value=' Upload Files '/>}[HttpPost]publicActionResultUploadFile(HttpPostedFileBase file){if(file !=null){Uploads.Add(file);}returnRedirectToAction("index);
}
Uploads is just a static collection so that we can easily return the file if requested.
Using the FileApi
Since this project is supposed to have a progress bar and allow multiple file uploads we’re going to make a few changes to the form.
@using(Html.BeginForm("uploadfile","home",FormMethod.Post,new{ enctype ="multipart/form-data"})){<input id="files-to-upload" type="file" multiple name="file"/><input type='submit' id='upload-files' value=' Upload Files '/><div class='progress-bar'></div>}
Notice the multiple keyword added to the input. I’ve also added a progress-bar div for later. We need to override the submit button to use the FileApi rather than the standard POST.
<scripttype="text/javascript">
$(function(){//is the file api available in this browser//only override *if* available.if(newXMLHttpRequest().upload){
$("#upload-files").click(function(){//upload files using the api//The files property is available from the//input DOM object
upload_files($("#files-to-upload")[0].files);returnfalse;});}});//accepts the input.files parameterfunction upload_files(filelist){if(typeof filelist !=="undefined"){for(var i =0, l = filelist.length; i < l; i++){
upload_file(filelist[i]);}}}//each file upload produces a unique POSTfunction upload_file(file){
xhr =newXMLHttpRequest();
xhr.upload.addEventListener("progress",function(evt){if(evt.lengthComputable){//update the progress bar
$(".progress-bar").css({
width:(evt.loaded / evt.total)*100+"%"});}},false);// File uploaded
xhr.addEventListener("load",function(){
$(".progress-bar").html("Uploaded");
$(".progress-bar").css({ backgroundColor:"#fff"});},false);
xhr.open("post","home/uploadfile",true);// Set appropriate headers// We're going to use these in the UploadFile method// To determine what is being uploaded.
xhr.setRequestHeader("Content-Type","multipart/form-data");
xhr.setRequestHeader("X-File-Name", file.name);
xhr.setRequestHeader("X-File-Size", file.size);
xhr.setRequestHeader("X-File-Type", file.type);// Send the file
xhr.send(file);}</script>
Now that we have this new upload script we’re going to have to update the back end to accommodate. I’ve created a new model called UploadedFile that will hold our upload regardless of where it came from.
publicclassUploadedFile{publicintFileSize{get;set;}publicstringFilename{get;set;}publicstringContentType{get;set;}publicbyte[]Contents{get;set;}}
In our home controller I’ve added the following method. It checks to see where the upload came from. If it came from the normal POST the Request.Files will be populated otherwise it will be part of the post data.
privateUploadedFileRetrieveFileFromRequest(){string filename =null;string fileType =null;byte[] fileContents =null;if(Request.Files.Count>0){//they're uploading the old wayvar file =Request.Files[0];
fileContents =newbyte[file.ContentLength];
fileType = file.ContentType;
filename = file.FileName;}elseif(Request.ContentLength>0){
fileContents =newbyte[Request.ContentLength];Request.InputStream.Read(fileContents,0,Request.ContentLength);
filename =Request.Headers["X-File-Name"];
fileType =Request.Headers["X-File-Type"];}returnnewUploadedFile(){Filename= filename,ContentType= fileType,FileSize= fileContents !=null? fileContents.Length:0,Contents= fileContents
};}
The UploadFile method will change slightly to use RetrieveFileFromRequest instead of taking directly from the Request.Files.
[HttpPost]publicActionResultUploadFile(){UploadedFile file =RetriveFileFromRequest();if(file.Filename!=null&&!Uploads.Any(f => f.Filename.Equals(file.Filename)))Uploads.Add(file);returnRedirectToAction("index);
}
It’s that simple. The only real difference between the two methods is that the HttpRequest.Files is not populated when using the FileApi. This can easily be used to create a Drag/Drop scenario by passinge.dataTransfer.files from the drop event into upload_files.
-Ben Dornis
http://buildstarted.com/2011/07/17/asp-net-mvc-3-file-uploads-using-the-fileapi/
Asp.net mvc 3 file uploads using the fileapi的更多相关文章
- asp.net mvc return file result
asp.net mvc返回文件: public ActionResult ExportReflection(string accessToken) { var reflections = GetCms ...
- ASP.Net MVC upload file with record & validation - Step 6
Uploading file with other model data, validate model & file before uploading by using DataAnnota ...
- [转]File uploads in ASP.NET Core
本文转自:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads By Steve Smith ASP.NET MVC ...
- ASP.NET MVC file download sample
ylbtech- ASP.NET MVC:ASP.NET MVC file download sample 功能描述:ASP.NET MVC file download sample 2,Techno ...
- ASP.NET MVC下使用文件上传
这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3. 根目录下添加新 ...
- 在asp.net mvc中上传大文件
在asp.net mvc 页面里上传大文件到服务器端,需要如下步骤: 1. 在Control类里添加get 和 post 方法 // get method public ActionResult Up ...
- Asp.net MVC 处理文件的上传下载
如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个, ...
- ASP.NET MVC 4 批量上传文件
上传文件的经典写法: <form id="uploadform" action="/Home/UploadFile" method="post& ...
- 利用Asp.net MVC处理文件的上传下载
如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个, ...
随机推荐
- wordpress高级教程
1.获取博客信息 <?php bloginfo(''); ?> // 显示博客的信息 /* 部分常用参数: default:默认 name:名称 description:说明 url.ho ...
- commons-logging log4j的联系区别
1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger, ...
- 背包问题lingo求解
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang !背包问题 题目: 8件物品 重量分别为 1,3,4,3,3,1,5,10 价值分别为 2,9 ...
- 页面正在载入js
页面显示(pageshow)和页面隐藏(pagehide)事件 http://blog.163.com/jiang_tao_2010/blog/static/121126890200911403336 ...
- Android应用程序插件化研究之AssertManager
最近在研究Android应用的插件化开发,看了好几个相关的开源项目.插件化都是在解决以下几个问题: 如何把插件apk中的代码和资源加载到当前虚拟机. 如何把插件apk中的四大组件注册到进程中. 如何防 ...
- BZOJ1430: 小猴打架
1430: 小猴打架 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 328 Solved: 234[Submit][Status] Descripti ...
- php+jquery+ajax+json的一个最简单实例
html页面: <html> <head> <meta http-equiv="content-type" content="text/ht ...
- 模仿TMALL搜索,下拉提示 优化 用户keypress停顿200毫秒间隔时,在执行异步取数据操作 通过underscore的函数debounce来实现
- list 操作
animals = ["aardvark", "badger", "duck", "emu", "fennec ...
- 关于我们-EIBOA易博男装-互联网品质男装品牌-在线销售男士西服,衬衫,外套,西裤,领带|全场免运费,30天退换货保障
关于我们 - 网站底部 | ELLE中国 | ELLE China 关于赫斯特国际集团 男人尚--专注男人时尚 关于男人尚 这些数据,你知道吗? 1.全国至少1亿男人的衬衫尺码错误: 2.57%的男人 ...