plupload将OPTIONS而不是POST提交给Web API

时间:2013-10-31 16:43:36

标签: asp.net-mvc asp.net-web-api plupload

拥有MVC应用程序和单独的WebAPI。使用plupload,当url指向MVC控制器中的方法时,文件将被POST。

这是Fiddler展示的内容

POST /Home/HandleUpload/ HTTP/1.1
Host: localhost:50000
Connection: keep-alive
Content-Length: 38040
Origin: http://localhost:50000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryT4glpqFi5sbmY2KL
Accept: */*
Referer: http://localhost:50000/Home/Index
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

当我将url更改为指向WebAPI时,我会收到OPTIONS请求而不是POST,因此API方法不会被命中。

OPTIONS /api/v1/Files/HandleUpload HTTP/1.1
Host: localhost:60000
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:50000
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:50000/Home/Index
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

我在plupload配置上唯一更改的是url。

这是我的方法。这两个项目都是一样的。

[HttpPost]
public HttpResponseMessage HandleUpload(int? chunk, string name)
{
    var fileUpload = HttpContext.Current.Request.Files[0];
    var uploadPath = HttpContext.Current.Server.MapPath("~/App_Data");
    chunk = chunk ?? 0;

    //write chunk to disk.   
    string uploadedFilePath = Path.Combine(uploadPath, name);
    using (var fs = new FileStream(uploadedFilePath, chunk == 0 ? FileMode.Create : FileMode.Append))
    {
        var buffer = new byte[fileUpload.InputStream.Length];
        fileUpload.InputStream.Read(buffer, 0, buffer.Length);
        fs.Write(buffer, 0, buffer.Length);
    }
}

1 个答案:

答案 0 :(得分:1)

我能够做到这一点,但不确定这是否是最佳做法。 filename在preinit函数的UI中设置

preinit: {
                            UploadFile: function (up, file) {


                                // You can override settings before the file is uploaded
                                // up.settings.url = 'upload.php?id=' + file.id;
                                //up.settings.multipart_params = { type: $("#Type").val(), title: $("#Title").val() };
                                up.settings.multipart_params = {
                                    filename: file.name
                                };

                            }
                        },

Web api代码

[HttpPost]
            public async Task<IHttpActionResult> UploadPropertyImage()
            {
                if (!Request.Content.IsMimeMultipartContent())
                    throw new Exception(); // divided by zero

                var provider = new MultipartMemoryStreamProvider();
                await Request.Content.ReadAsMultipartAsync(provider);



                var name = await provider.Contents.SingleOrDefault(p => p.Headers.ContentDisposition.Name == "\"name\"").ReadAsStringAsync();
                var chunk = await provider.Contents.SingleOrDefault(p => p.Headers.ContentDisposition.Name == "\"chunk\"").ReadAsStringAsync();
                var chunks = await provider.Contents.First(p => p.Headers.ContentDisposition.Name == "\"chunks\"").ReadAsStringAsync();
                var filename = await provider.Contents.First(p => p.Headers.ContentDisposition.Name == "\"filename\"").ReadAsStringAsync();
                var buffer = await provider.Contents.First(p => p.Headers.ContentDisposition.Name == "\"file\"").ReadAsByteArrayAsync();
                //var Id = await provider.Contents.First(p => p.Headers.ContentDisposition.Name == "\"Id\"").ReadAsByteArrayAsync();
                var Id = Guid.Empty;

                var uploadPath =  HostingEnvironment.MapPath(Path.Combine("~/app_data",Id.ToString()));


                if (!Directory.Exists(uploadPath))
                    Directory.CreateDirectory(uploadPath);

                using (var fs = new FileStream(Path.Combine(uploadPath,name), chunk == "0" ? FileMode.Create : FileMode.Append))
                      fs.Write(buffer, 0, buffer.Length);


                return Ok();
            }