ASP.NET WEB API 使用MultipartFormDataStreamProvider上传文件

摸索过程中

参照:https://blog.shibayan.jp/entry/20150319/1426750361

public async Task FileUpload()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        return StatusCode(HttpStatusCode.UnsupportedMediaType);
    }
    var rootPath = Path.GetTempPath();
    var provider = new MultipartFormDataStreamProvider(rootPath);

    await Request.Content.ReadAsMultipartAsync(provider);

    foreach (var file in provider.FileData)
    {
        var fileInfo = new FileInfo(file.LocalFileName);
    }
    return Ok();
}

但存储文件时名称以BodyPart_打头,不是上传的真实文件名,需要重构原始的MultipartFormDataStreamProvider方法,如下

public class MultipartFileWithExtensionStreamProvider : MultipartFileStreamProvider
    {
        public MultipartFileWithExtensionStreamProvider(string rootPath)
            : base(rootPath) { }
        public override string GetLocalFileName(HttpContentHeaders headers)
        {
            return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        }
    }

问题解决了

完整代码如下

        [HttpPost]
        [Route("api/file/upload")]
        public async Task FileUpload()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
            
            Dictionary queryString = AspUtil.GetRequestUriQueryDictionary(Request);
            queryString.TryGetValue("rootPath", out string rootPath);
            rootPath = rootPath?? @"C:\RelaySvrUpdater";
            var provider = new MultipartFileWithExtensionStreamProvider(rootPath);
            List files = new List();

            try
            {
                await Request.Content.ReadAsMultipartAsync(provider);

                foreach (MultipartFileData file in provider.FileData)
                {
                    files.Add(Path.GetFileName(file.LocalFileName));
                }
                return Request.CreateResponse(HttpStatusCode.OK, files);
            }
            catch (System.Exception e)
            {
                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }
        }

    public class MultipartFileWithExtensionStreamProvider : MultipartFileStreamProvider
    {
        public MultipartFileWithExtensionStreamProvider(string rootPath)
            : base(rootPath) { }
        public override string GetLocalFileName(HttpContentHeaders headers)
        {
            return headers.ContentDisposition.FileName.Replace("\"", string.Empty);
        }
    }

Postman调试,rootPath可不填

header中 Content-Type :multipart/form-data ,body中选择form-data,然后选择上传File

ASP.NET WEB API 使用MultipartFormDataStreamProvider上传文件_第1张图片

不支持text格式上传,会报错;

优化:返回结果可以拼装成json格式,这样更清晰些

你可能感兴趣的:(C#学习,Visual,Studio,2017,接口测试)