前端页面代码:

<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方式多文件上传的更多相关文章

  1. el-upload用form的方式多文件上传的方法

    使用el-upload组件遇到的坑. 1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了. 发送请求的部分没有注释的部分是我分装了调后台的api,注释 ...

  2. ajax+php (jquery.form插件)实现异步文件上传

    <!DOCTYPE html> <html lang="CN"> <head> <title>upload model</ti ...

  3. WordPress Contact Form 7插件任意文件上传漏洞

    漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...

  4. python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,

    python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...

  5. ANDROID使用MULTIPARTENTITYBUILDER实现类似FORM表单提交方式的文件上传

    最近在做 Android 端文件上传,要求采用 form 表单的方式提交,项目使用的 afinal 框架有文件上传功能,但是始终无法与php写的服务端对接上,无法上传成功.读源码发现:afinal 使 ...

  6. 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...

  7. jquery ajax file upload NET MVC 无刷新文件上传

    网上有各种各样的文件上传方法,有基于JS框架的.也有基于flash swf插件的. 这次分享一个比较简单而且实用能快速上手的文件上传方法,主要步骤: 1.引用Jquery包,我用的是jquery-1. ...

  8. C#模拟请求,模拟登录,Cookie设置、文件上传等问题汇总

    由于业务需求,最近需要模拟完成登陆某个网站,并上传所需要的文件.在开发途中,遇到了很多问题,现在,就我遇到的一些问题及解决办法说明如下,希望对遇到同样问题的人有所帮助.因为技术有限,可能有些内容并不完 ...

  9. SpringMVC注解方式与文件上传

    目录: springmvc的注解方式 文件上传(上传图片,并显示) 一.注解 在类前面加上@Controller 表示该类是一个控制器在方法handleRequest 前面加上 @RequestMap ...

随机推荐

  1. 有趣的回文数(Palindrome number)

    文章转自http://blog.163.com/hljmdjlln@126/blog/static/5473620620120412525181/ 做LC上的题"Palindrome num ...

  2. Java访问重定向接口

    背景:开发做了一个免登陆的接口,方便我后续给管理后台做一些小工具,问题来了,给的免登陆接口是个302如图的test_login,在重定向一个200的接口(eload_admin), 原本开始这样做:0 ...

  3. 在Nutz中如何配置多个数据库源,并且带事务控制

    在Nutz中如何配置多个数据库源,并且带事务控制  发布于 560天前  作者 Longitude 995 次浏览  复制  上一个帖子  下一个帖子  标签: 无 在Nutz中如何配置多个数据库源, ...

  4. 轻量级HTTP服务器Nginx(入门与安装篇)

    轻量级HTTP服务器Nginx(入门篇)   文章来源于南非蚂蚁   一.什么是Nginx 相信很多读者都对Apache非常熟悉,与Apache类似,Nginx是一款高性能的HTTP和反向代理服务器软 ...

  5. 【转】Xcode真机测试could not find developer disk image解决方法

    在使用Xcode进行真机调试的时候,有时根据真机的系统不同,会出现could not find developer disk image 错误,这是由于真机系统过高或者过低,Xcode中没有匹配的配置 ...

  6. jeDate日期控件

    http://www.jayui.com/jedate/     这是日期控件官网,可以去里面下载使用 前台 <%@ Page Language="C#" AutoEvent ...

  7. 深入浅出:了解JavaScript的ES6、ES7新特性

    参照阮一峰博客:http://es6.ruanyifeng.com/#README es6常见题:https://blog.csdn.net/qq_39207948/article/details/8 ...

  8. Golang反射机制

    Go反射机制:在编译不知道类型的情况下,可更新变量.在运行时查看值.调用方法以及直接对它们的布局进行操作. 为什么使用反射 有时需要封装统一接口对不同类型数据做处理,而这些类型可能无法共享同一个接口, ...

  9. linux系统ext文件系统知识

    ext2文件系统细节 我们都知道,操作系统中的数据分为文件内容和文件属性两部分,其中文件内容就是文件的实体数据,而文件属性就是文件类型.权限.属主.修改时间等信息.操作系统会将上述文件的内容放入磁盘文 ...

  10. Windows下如何安装composer

    相对 来说并不难直接将此文件下载安装即可 1 https://getcomposer.org/Composer-Setup.exe 文件地址由官方提供 https://getcomposer.org/ ...