如何通过Web API中的post请求接收流和对象?

时间:2018-02-16 10:51:09

标签: c# rest asp.net-web-api

我目前正在使用Web API开发REST Web服务。

现在我正试图通过帖子接收流文件和对象。

当我在没有JobPosition对象的情况下发送它时,我正确地收到了文件,当我发送没有文件的JobPosition时,我正确地收到了JobPosition。

但是当我通过邮递员发送流文件和对象时,我收到错误。

如果有可能,我将非常感谢您的帮助,如果可行,我将非常感谢您提供帮助的方向。

public class JobPosition
{
    public int Id { set; get; }
    public string Title { set; get; }
}

[HttpPost]
[Route("Job")]
public async Task<bool> Post(JobPosition job)
{
    var multipartMemoryStreamProvider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(multipartMemoryStreamProvider, new CancellationToken());
    var stream = await multipartMemoryStreamProvider.Contents[0].ReadAsStreamAsync();
    // implementaion
    return true;
}

邮差要求: enter image description here enter image description here

我尝试了与Content-Type的所有可能组合,但没有成功。

3 个答案:

答案 0 :(得分:4)

删除(JobPosition job)动作函数参数,而不是通过multipartMemoryStreamProvider对象使用您自己的代码读取它。

await multipartMemoryStreamProvider.Contents[0].ReadAsStreamAsync(); //Stream
await multipartMemoryStreamProvider.Contents[1].ReadAsStreamAsync(); //JSON

这样的事情。订单很重要。如果你改为假设它可以以任何顺序出现,循环遍历Contents集合,并根据变量的名称进行处理,那将是最好的。

答案 1 :(得分:2)

如果您使用的是.NET核心,可以尝试一下吗?

public class JobPosition
{
    public int Id { set; get; }
    public string Title { set; get; }
    public IFormFile jobFile {set; get; }
}

[HttpPost]
[Route("Job")]
public async Task<bool> Post(JobPosition job)
{
    if (!Request.ContentType.Contains("multipart/form-data"))
    {
        return BadRequest();
    }

    // your implementation
    // you can access the file by job.jobFile
    // you can read the contents of the file by opening a read stream from the file object and read it to a byte[]
    return true;
}

此处更多关于IFormFile

答案 2 :(得分:2)

也许您可以使用MultipartFormDataStreamProvider提供的FormData来提取JobPosition。

    public async Task<IHttpActionResult> PostUploadFile()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

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

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            NameValueCollection formdata = provider.FormData;

            JobPosition jobPosition = new JobPosition()
            {
                Id = formdata["Id"],
                Title = bool.Parse(formdata["Title"])
            };

            foreach (MultipartFileData file in provider.FileData)
            {
                var fileName = file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);
                byte[] documentData = File.ReadAllBytes(file.LocalFileName);


                /// Save document documentData to DB or where ever
                /// --- TODO
            }
            return Ok(jobPosition);
        }
        catch (System.Exception e)
        {
            return BadRequest(e.Message);
        }
    }