的ASP.NET Web API文件保存为“BodyPart_3ded2bfb-40BE-4183-

2019-06-25 10:05发布

我上传使用ASP.NET Web API的文件。 我的RC之前已经做了这一点,但由于某种原因,该文件被保存为“BodyPart_3ded2bfb-40BE-4183-b789-9301f93e90af”,而不是文件名。 下面的文件名可变返回此正文部分字符串,而不是过多的文件名。 我似乎无法找出我要去哪里错了。 任何帮助表示赞赏。

客户代码:

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
    });
}; 

控制器:

    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());

这些文件看起来像:

Answer 1:

这是我们做了一个Concious酒店的改变 - 它被认为是安全风险采取的Content-Disposition头字段中提供的文件名等,而不是我们现在计算文件名是你所看到的。

如果你想控制服务器的本地文件名自己,那么你可以从MultipartFormDataStreamProvider派生并重写GetLocalFileName提供你想要的任何名称。 不过,请注意,可能有安全方面的考虑这样做。

希望这可以帮助,

亨里克



Answer 2:

我更新的代码教程,使其与的ASP.NET Web API RC工作。 事实上,随着亨里克提到内容处置不再使用的文件名。 查看源文件在文章底部- http://www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload-with-asp-net-webapi/

请注意,有进一步改变MultipartFormDataStreamProvider未获得晋级到RC,所以它现在更加灵活。 亨里克博客上讲述那些在这里- 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 /



Answer 3:

在这里,这个工作对我来说

在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);
    }
}

然后

 string root = HttpContext.Current.Server.MapPath("~/App_Data");       
 CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root);

谢谢,



文章来源: ASP.NET Web API File saved as “BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af”