如何在我的webapi控制器的帖子中同时收到json和二进制数据?

时间:2016-03-29 20:34:53

标签: c# json asp.net-web-api asp.net-web-api2

我创建了一个名为Event的课程。我的Event类包含Documents列表。 Document是我创建的另一个类。每个Document类都包含一个名为DocumentData的类,该类具有FileData类型byte[]的属性。

所以它看起来像这样:

myEventObj.Documents[0].DocumentData.FileData

现在,接受新的Events的我的控制器只接受json数据,除了FileData之外,这对我的Event类中的所有内容都很好。

我有另一个接受文件上传的控制器。问题是,我没有简单的方法来链接我的第二个控制器接受的二进制文件数据,并将其与发送到我的第一个控制器的FileData Event属性配对。如何将它们组合在一起,以便只有一次调用我的Web服务来保存Event以及任何文件数据?

这是我的事件控制器的Post和Put功能:

[HttpPost]
public IHttpActionResult Post(Event coreEvent) {
    coreEvent.PrepareToPersist();
    _unitOfWork.Events.Add(coreEvent);
    _unitOfWork.Complete();
    return Created("api/events/" + coreEvent.EventId, coreEvent);
}

[HttpPut]
public IHttpActionResult Put(Event coreEvent) {
    coreEvent.PrepareToPersist();
    _unitOfWork.Events.Update(coreEvent);
    _unitOfWork.Complete();
    return Ok(coreEvent);
}

这是我的控制器的Post函数,用于处理文件上传:

[HttpPost]
public async Task<IHttpActionResult> Post() {
    if (!Request.Content.IsMimeMultipartContent()) {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();

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

        foreach (var file in provider.Contents) {
            string filename = file.Headers.ContentDisposition.FileName.Trim('\"');
            byte[] buffer = await file.ReadAsByteArrayAsync();
        }
        return Ok();
    }
    catch (System.Exception e) {
        return InternalServerError(e);
    }
}

我如何把它们放在一起?

1 个答案:

答案 0 :(得分:0)

通常我更喜欢两种方法来支持多个ajax上传文件,所以第二种方法将支持Ajax上传文件,并在将其保存到服务器上的某个位置并添加一个后,将为上传的文件返回一个唯一的密钥。在数据库中记录它(例如:附件表),

当你调用第一个冒充事件的方法时,你的对象myEventObj.Documents [0] .DocumentData.FileData将包含来自第二种方法的返回键,所以你的对象可能是myEventObj.Documents作为字符串列表(文件键)

由于