Riv*_*vka 34 asp.net-mvc http multipartform-data file asp.net-web-api
我正在使用ASP.NET Web API上传文件.我在RC之前做过这个,但由于某种原因,文件被保存为"BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af"而不是文件名.下面的filename变量也会返回此bodypart字符串而不是文件名.我似乎无法弄清楚我哪里出错了.任何帮助表示赞赏.
客户代码:
function upload() {
$("#divResult").html("Uploading...");
var formData = new FormData($('form')[0]);
$.ajax({
url: 'api/files/uploadfile?folder=' + $('#ddlFolders').val(),
type: 'POST',
success: function (data) {
$("#divResult").html(data);
},
data: formData,
cache: false,
contentType: false,
processData: false
});
};
Run Code Online (Sandbox Code Playgroud)
控制器:
public Task<HttpResponseMessage> UploadFile([FromUri]string folder)
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType));
}
// Save file
MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files"));
Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider);
return task.ContinueWith<HttpResponseMessage>(contents =>
{
string filename = provider.BodyPartFileNames.First().Value;
return new HttpResponseMessage()
{
Content = new StringContent(string.Format("File saved in {0}.", folder))
};
}, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
文件看起来像:
小智 46
这是我们做出的一个有趣的改变 - 获取Content-Disposition头字段中提供的文件名被认为是一种安全风险,因此我们现在计算一个你所看到的文件名.
如果您想自己控制服务器本地文件名,那么您可以从MultipartFormDataStreamProvider派生并覆盖GetLocalFileName以提供您想要的任何名称.请注意,可能存在安全性因素.
希望这可以帮助,
亨里克
Fil*_*p W 18
我更新了教程的代码,使其适用于ASP.NET Web API RC.实际上,正如Henrik所说,Content-Disposition不再使用文件名.请参阅帖子底部的源文件 - http://www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload-with-asp-net-webapi/
请注意,对于没有切割到RC的MultipartFormDataStreamProvider还有进一步的更改,所以它现在更加灵活.Henrik在这里写了博客 - http://blogs.msdn.com/b/henrikn/archive/2012/04/27/asp-net-web-api-updates-april-27.aspx.
编辑:我发表了关于在Web API RTM中上传文件的新方法和改进方法的博客,因此希望有助于整理内容 - http://www.strathweb.com/2012/08/a-guide-to-asynchronous-file -uploads式-ASP网的Web-API-RTM /
小智 11
在这里,这项工作对我而言
在API控制器中
// We implement MultipartFormDataStreamProvider to override the filename of File which
// will be stored on server, or else the default name will be of the format like Body-
// Part_{GUID}. In the following implementation we simply get the FileName from
// ContentDisposition Header of the Request Body.
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
public CustomMultipartFormDataStreamProvider(string path) : base(path) { }
public override string GetLocalFileName(HttpContentHeaders headers)
{
return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
然后
string root = HttpContext.Current.Server.MapPath("~/App_Data");
CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root);
Run Code Online (Sandbox Code Playgroud)
谢谢,
归档时间: |
|
查看次数: |
23494 次 |
最近记录: |