使用Multipart请求将文件上载到Web API

时间:2016-03-22 02:37:15

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

我有一个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 的内容类型。形成我的请求的最佳方式是什么?另外,构建Web API控制器以处理Multipart请求的最佳方法是什么?

1 个答案:

答案 0 :(得分: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调用示例。

希望它有所帮助!