我目前正在使用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;
}
我尝试了与Content-Type的所有可能组合,但没有成功。
答案 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);
}
}