Uploadify 结合 Web API 2 上传问题

最近使用jQuery.Uploadify和Web API配合来做上传,碰到问题,还木有办法解决,记录一下:

环境:jQuery 1.10.2,Uploadify 3.2.1,SWFObject 2.2,Web API 2

前端相关代码(JavaScript):

$("#file-upload").uploadify({

    "auto": false,

    "multi": false,

    "buttonText": "请选择文件",

    "swf": "/upload.swf",

    "uploader": "/api/up",

    "uploadLimit": 1,

    "removeCompleted": false,

    "onSelect": function (file) {

        $("#btn-upload").prop("disabled", false);

    },

    "onCancel": function (file) {

        $("#btn-upload").prop("disabled", true);

    },

    "onUploadStart": function (file) {

        alert("开始上传:" + file.name);

    },

    "onUploadSuccess": function (file, data, response) {

        alert("上传[" + file.name + "]成功");

    },

    "onUploadError": function (file, errorCode, errorMsg, errorString) {

        alert("上传[" + file.name + "]失败");

    }

});

服务端相关代码(C#)

接收文件的ApiController:

using System;

using System.IO;

using System.Net.Http;

using System.Net.Http.Headers;

using System.Text;

using System.Threading.Tasks;

using System.Web;

using System.Web.Http;
[HttpPost]

public async Task<bool> UploadFile()

{

    if (!Request.Content.IsMimeMultipartContent("form-data"))

    {

        return false;

    }



    var root = HttpContext.Current.Server.MapPath("~/upload/temp");

    var provider = new CustomMultipartFormDataStreamProvider(root);

    var body = await Request.Content.ReadAsMultipartAsync(provider);

    var result = body.FileData[0].LocalFileName;

    return true;

}

新建一个CustomMultipartFormDataStreamProvider类,继承自MultipartFormDataStreamProvider,用于还原上传的文件名:

public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider

{

    public CustomMultipartFormDataStreamProvider(string path)

        : base(path)

    { }



    public override string GetLocalFileName(HttpContentHeaders headers)

    {

        var sb = new StringBuilder((headers.ContentDisposition.FileName ?? DateTime.Now.Ticks.ToString()).Replace("\"", "").Trim().Replace(" ", "_"));

        Array.ForEach(Path.GetInvalidFileNameChars(), invalidChar => sb.Replace(invalidChar, '-'));

        return sb.ToString();

    }

}

上面的代码完成后,能够顺利跑起来,测试了一下,文件已经成功上传到服务器,但是,上传结果始终显示失败,一直报错:Error writing MIME multipart body part to output stream.

这下可奇怪了,Google了半天,找到了相关的说明,原来是Web API 2 Framework的Bug,和Flash的换行符有关,一方面,等待MS修复(MS已经在修复了,预计在Web API 2.1里面将修复),另外一个方面,应该可以通过其他方式来解决,不管了,先记录下来,等解决了,再完成本文。

以下是国外的网友讨论和MS相关的说明,全部系英文,感兴趣的园友可以去看看。

国外网友讨论(英文)

MS开发团队说明(英文)

MS开发团队的另一个说明(英文)

你可能感兴趣的:(uploadify)