代替:
$.each($(fileInput).get(0).files, function (index, value) { formdata.append($(this).attr('name'), $(this));});
您可以使用:
$.each($(fileInput).get(0).files, function (index, value) { formdata.append(value.name, value);});
主要区别在于,使用您的方法,Content-Disposition部分不包含
filename,因此ASP.NET无法将其识别为文件内容:
------WebKitFormBoundaryZxwCwBC0O8Q3hOAOContent-Disposition: form-data; name="foo.png"[object Object]------WebKitFormBoundaryZxwCwBC0O8Q3hOAOContent-Disposition: form-data; name="bar.png"[object Object]------WebKitFormBoundaryZxwCwBC0O8Q3hOAO--
用我的方法,请求将如下所示:
------WebKitFormBoundary1ERBVX0wzdVczcR0Content-Disposition: form-data; name="foo.png"; filename="foo.png"Content-Type: imag/png[object Object]------WebKitFormBoundary1ERBVX0wzdVczcR0Content-Disposition: form-data; name="bar.png"; filename="bar.png"Content-Type: image/png[object Object]------WebKitFormBoundary1ERBVX0wzdVczcR0--
现在您可以看到实际的差异。在第一种情况下,您将没有文件
filename或
Content-Type文件,ASP.NET只会将这些元素视为标准表单发布的数据,而不是文件。
另外,不要使用实际的文件名,
name而是可以考虑将其替换为一些通用的文件名:
$.each($(fileInput).get(0).files, function (index, value) { formdata.append('sliderFiles', value);});
现在,您可以通过采用
List<HttpPostedFilebase>参数而不是使用来进一步改善控制器 *** 作
Request.Files:
[HttpPost]public ActionResult UploadSlider(List<HttpPostedFilebase> sliderFiles){ ...}
关于您的代码的另一句话是,HTML5
FormData在订购浏览器中不可用,并且您的代码将自动失败。如果您需要支持较旧的浏览器,则可能需要通过测试浏览器的功能来执行渐进式增强,如果浏览器不支持FormData,则退回到标准表格POST:
$("#" + form).on("submit", function (e) { if(window.FormData === undefined) { // The browser doesn't support uploading files with AJAX // falling back to standard form upload } else { // The browser supports uploading files with AJAX => // we prevent the default form POST and use AJAX instead e.preventDefault(); ... }});
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)