【问题标题】:File upload to Web API using Multipart request使用 Multipart 请求将文件上传到 Web API
【发布时间】:2016-03-23 16:18:59
【问题描述】:

我有一个 Silverlight 应用程序,它使用 Web API 上传作为文件流存储在数据库中的文档。目前它是通过带有 Content-Type: application/json 的 POST 完成的。包含文件的字节数组以及有关文件的一些元数据的对象被序列化为 JSON 并发布到 Web API。 Web API 然后将字节数组作为文件流保存到数据库。

以下是当前请求的示例:

{"FileContent":"JVBERi0xLjUNJeLjz9MNCjEwIDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDI3MTg2L08gMTIvRSAyMjYyNi9OIDEvVCAyNjg4NC9IIFsgNDg5IDE2OF0+Pg1lbmRvYmoNICAgICAgICAgICAgICAgICAgDQoyNyAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNC9QcmVkaWN0b3IgMTIg0K","ProductId":"85c98324-092a-4d10-bab0-03912e437234","OrderId":"7b826322-7526-4a69-b67c-5c88a04f4c60","FileName":"test.pdf","FileType":1,"FileDescription":"test"}

我想将此逻辑更改为发布为 Multipart 的 Content-Type。提出我的请求的最佳方式是什么?此外,构建 Web API 控制器以处理多部分请求的最佳方式是什么?

【问题讨论】:

    标签: json silverlight asp.net-web-api


    【解决方案1】:

    这是分段上传的示例。

        [HttpPost]
        [Route("upload")]
        public async Task<IHttpActionResult> Upload()
        {
            MultipartFileData file = null;
    
            // Check if the request contains multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent())
            {
                return UnsupportedMediaType();
            }
    
            // initialize path and provider
            string root = HttpContext.Current.Server.MapPath("~/App_Data");
            if (Directory.Exists(root) == false) Directory.CreateDirectory(root);
    
            var provider = new MultipartFormDataStreamProvider(root);
    
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);
    
            try
            {
                // we take the first file here
                file = provider.FileData[0];
    
                // and the associated datas
                int myInteger;
                if (int.TryParse(provider.FormData["MyIntergerData"], out myInteger) == false)
                    throw new ArgumentException("myInteger is missing or not valid.");
    
                var fileContent = File.ReadAllBytes(file.LocalFileName);
    
                // do something with your file!
            }
            finally
            {
                // get rid of temporary file
                if (file != null)
                    File.Delete(file.LocalFileName);
            }
    
            // successfull!
            return NoContent();
        }
    

    这是我从我的 API 中获得的示例。每次上传可以有多个文件(检查provider.FileData 数组),provider.FormData 数组内有不同的数据。

    对于客户端方面,我建议您查看this 答案以获取对此 API 的 JS 调用示例。

    希望对你有帮助!

    【讨论】:

    • 感谢您的回复。我正在寻找确定形成我的请求的最佳方式,该请求将包括文件和元数据。另外,我希望将文件存储到 SQL DB 中的 Filestream 文件中。使用我的控制器执行此操作的最佳方法是什么?
    • 我更新了我的答案,其中包含一个指向 js 上传客户端示例的链接。对于文件流,这取决于您如何访问数据;使用 SqlFileStream 检查这个小示例:blogs.msdn.microsoft.com/spike/2011/02/28/…
    • 当使用 MultipartFormDataStreamProvider 时,我最好将文件临时存储在临时目录中,然后再将它们保存到 Filestream 列?另外,如果我从 Silverlight 或 UWP 进行 POST,我还会使用 FormData 吗?
    猜你喜欢
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2017-12-22
    • 2017-07-10
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多