拥有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);
}
}
答案 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();
}