WebApi实现Ajax模拟Multipart/form-data方式多文件上传
前端页面代码:
- <input type="file" class="file_control" /><br />
- <input type="file" class="file_control" /><br />
- <input type="file" class="file_control" />
- <button id="btnUpload" type="button">上传</button>
- <script type="text/javascript">
- $(document).ready(function () {
- $("#btnUpload").click(function () {
- var formdata = new FormData();
- var files = $(".file_control");
- $.each(files, function (index, domEle) {
- formdata.append("file" + index, domEle.files[0]);
- });
- $.ajax({
- url: '/api/Service/UpLoad',
- type: 'POST',
- cache: false,
- data: formdata,
- processData: false,
- contentType: false,
- success: function (data) {
- alert(data.success);
- },
- error: function () {
- alert("error");
- }
- }).done(function (res) {
- }).fail(function (res) {
- });
- });
- </script>
后端代码:
- /// <summary>
- /// 文件上传
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- [HttpPost]
- [Route("api/Service/UpLoad")]
- public Task<HttpResponseMessage> UpLoad(HttpRequestMessage request)
- {
- if (!request.Content.IsMimeMultipartContent())
- throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
- if (!ModelState.IsValid)
- throw new HttpResponseException(HttpStatusCode.BadRequest);
- string root = AppDomain.CurrentDomain.BaseDirectory + @"UploadFiles";
- if (!Directory.Exists(root))
- Directory.CreateDirectory(root);
- MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(root);
- var task = request.Content.ReadAsMultipartAsync(provider).ContinueWith<HttpResponseMessage>(t =>
- {
- if (t.IsFaulted || t.IsCanceled)
- return request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
- HttpResponseMessage response = null;
- string filePath = root + @"\" + DateTime.Now.ToString("yyyyMMdd");
- if (!Directory.Exists(filePath))
- Directory.CreateDirectory(filePath);
- foreach (var file in provider.FileData)
- {
- string fileName = file.Headers.ContentDisposition.FileName;
- if (Regex.IsMatch(fileName, @"^"".*""$"))
- fileName = fileName.Trim('"');
- if (Regex.IsMatch(fileName, @"[\\/]+"))
- fileName = Path.GetFileName(fileName);
- string extName = Path.GetExtension(fileName);
- string tempName = DateTime.Now.Ticks.ToString() + extName;
- File.Copy(file.LocalFileName, Path.Combine(filePath, tempName));
- if (File.Exists(file.LocalFileName))
- File.Delete(file.LocalFileName);
- // 转存阿里OSS、七牛云、腾讯云COS
- response = request.CreateResponse(HttpStatusCode.OK, new { success = true });
- }
- return response;
- });
- return task;
- }
*注:如果报IsFaulted=true的错误,基本上是因为你没给input起name造成的。
WebApi实现Ajax模拟Multipart/form-data方式多文件上传的更多相关文章
- el-upload用form的方式多文件上传的方法
使用el-upload组件遇到的坑. 1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了. 发送请求的部分没有注释的部分是我分装了调后台的api,注释 ...
- ajax+php (jquery.form插件)实现异步文件上传
<!DOCTYPE html> <html lang="CN"> <head> <title>upload model</ti ...
- WordPress Contact Form 7插件任意文件上传漏洞
漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...
- python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,
python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...
- ANDROID使用MULTIPARTENTITYBUILDER实现类似FORM表单提交方式的文件上传
最近在做 Android 端文件上传,要求采用 form 表单的方式提交,项目使用的 afinal 框架有文件上传功能,但是始终无法与php写的服务端对接上,无法上传成功.读源码发现:afinal 使 ...
- 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传
Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...
- jquery ajax file upload NET MVC 无刷新文件上传
网上有各种各样的文件上传方法,有基于JS框架的.也有基于flash swf插件的. 这次分享一个比较简单而且实用能快速上手的文件上传方法,主要步骤: 1.引用Jquery包,我用的是jquery-1. ...
- C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总
由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件.在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助.因为技术有限,可能有些内容并不完 ...
- SpringMVC注解方式与文件上传
目录: springmvc的注解方式 文件上传(上传图片,并显示) 一.注解 在类前面加上@Controller 表示该类是一个控制器在方法handleRequest 前面加上 @RequestMap ...
随机推荐
- ERP和C4C中的function location
SAP ERP里的Functional Locations,下载到SAP Cloud for Customer后成为类型为'Functional Location'的Installation Poin ...
- CPU体系结构
http://blog.csdn.net/liuxc0116/article/details/17004313 1.算术逻辑单元ALU(Arithmetic Logic Unit)ALU是运算器的核心 ...
- 缓存验证Last-Modifie和Etag的使用
看这张图,是浏览器发出请求到请求缓存到过程,这么一个原理 那么http里面如何进行验证呢?主要有两个验证到http头 Last-Modified(上次修改时间) 主要配合If-Modified-Sin ...
- 计算1到n的n次方之和
实现效果: 知识运用: Math类的Pow方法:返回指定数字的指定次幂 public static double Pow(double x,double y) 实现代码: public string ...
- Maven 配置本地依赖jar
现有json-1.0.jar,引入依赖方法如下: 1. 在项目下新建 lib 目录,复制json-1.0.jar到lib目录下 pom.xml中添加配置 <dependency> < ...
- matlab 下载
Obrazy DVD programu Matlab ke stažení Verze 2015b Verze 2015a Verze 2014b Verze 2014a Verze 2012b Ve ...
- P1069 细胞分裂
P1069 细胞分裂 考虑质因数分解 先将m1,质因数分解后再根据数学定理将所有质数的质数全乘m2 然后将输入的数据相同处理,再判断 顺便说一下判断规矩 1肯定不行 如果分解后有没有m1质因数分解中的 ...
- iPad游戏 Calcculator: The Game 程序自动计算求解方法
今天在iPad上下了个小游戏,主要是一个计算器的界面,有开始值,目标值,限定步数,以及一些加减乘除,还有作者脑洞想出来的功能键,主要有左移,直接把一个数加到末尾,将其中的某个数改为另一个数等等..玩到 ...
- Rxjava+retrofit+mvp整合
转载请标明出处: http://blog.csdn.net/forezp/article/details/52621898 本文出自方志朋的博客 最近在看Rxjava,写了一个简单的 demo整合了R ...
- POJ2409 Let it Bead(Polya定理)
Let it Bead Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6443 Accepted: 4315 Descr ...