当前位置: 首页 > 知识库问答 >
问题:

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

糜博远
2023-03-14

我目前正在使用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;
}

我尝试了所有可能的内容类型组合,但没有成功。

共有3个答案

子车芷阳
2023-03-14

如果您正在使用。NET core,你能试试这个吗?

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的信息。

穆浩皛
2023-03-14

也许您可以使用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);
        }
    }
袁雅逸
2023-03-14

删除(JobPosition作业)操作函数参数,改为通过multipartMemoryStreamProvider对象使用自己的代码读取该参数。

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

类似的东西。顺序很重要。最好是假设它可以以任何顺序出现,循环处理Contents集合,并根据变量的名称进行处理。

 类似资料:
  • 我是ASP的新手。网我对POST请求有问题。也许我的代码错了,我找不到在哪里! 当我尝试post请求时,Postman会向我发送错误消息: "ExceptionType":"System.网。http://http.不支持的媒体类型异常","StackTrace":"àSystem.网。http://http.HttpContent扩展。ReadAsAsync[T](HttpContent内容,类

  • 问题内容: 我们制作了一个AngularJS应用,其中用户打开一个URL(xyz.com/booking)填写表格,然后选择一些要购买的物品。 之后,该用户单击“购买”按钮,并离开该站点进入支付网关站点。成功付款后,Payment Gateway会通过在回调URL(xyz.com/booking- success)上发送POST请求来发回用户。 现在的问题是,我为该回调URL配置的相应Angula

  • 问题内容: 如何从CherryPy中的POST请求接收JSON? 我去过此页面,尽管它在解释API,其参数及其作用方面做得很好。我似乎无法弄清楚如何使用它们将传入的JSON解析为一个对象。 这是我到目前为止的内容: 而且,这是我的jquery调用以发布帖子 问题答案: 工作示例: 链接到的文档介绍了3.2版中的几个CherryPy工具。该工具基本上可以更严格地完成上述操作,并使用3.2中的新主体处

  • 我正在使用RestTemplate方法将请求发布到endpoint。我在不同的文件中有和,我想把它们传递给POST请求,除此之外,我还想把传递给endpoint。 我能够成功地传递头和请求,但不能传递包含凭据的Http实体 有没有办法让我三样东西都及格 > HttpHeader 要求 这是我的密码 以下代码位于NewHttpHeader中。包含和

  • 问题内容: 我正在尝试使用Socket处理Java中的简单POST请求。我可以接收请求标头并毫无问题地回答请求,但是我当然无法获取请求的正文。 我读过某个地方,我需要打开第二个InputStream来达到这个目的,但这对我来说真的没有意义。您对如何获取请求正文有任何建议吗? 这是我基本上用来获取标头的内容: 因此,我收到的消息是这样的: 但是我无法获取POST请求的参数。 编辑: 因此事实证明,我

  • 问题内容: 如何通过JavaScript发送跨域POST请求? 注意-它不应该刷新页面,之后我需要抓取并解析响应。 问题答案: 如果你控制要发布的服务器,只需在服务器上设置响应头即可利用“跨域资源共享标准”。此答案在该主题的其他答案中进行了讨论,但我认为不是很清楚。 简而言之,这里是如何完成从from.com/1.html到to.com/postHere.php的跨域POST(以PHP为例)。注意