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造成的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现