在Web API中处理来自POST或PUT REST请求的二进制数据
本文关键字:REST PUT 请求 数据 二进制 POST API Web 处理 | 更新日期: 2023-09-27 17:57:58
我目前正在使用web API开发RESTweb服务。我在处理通过POST请求传输的二进制数据(图像)时遇到问题。
从客户端的角度来看,我已经成功地使用jQuery Form插件发送了二进制数据。但由于我是.NET的新手(我是一名PHP开发人员),因此在服务器上通过Web API处理这些二进制数据时遇到了困难。
为了确认jQuery Form插件正确发送图像数据,我编写了一个使用简单$_FILE
全局变量的PHP处理程序。
现在我正试图通过Web API实现同样的功能。这是我所尝试的一个概要。如何访问已发送的二进制数据?
型号:
namespace EDHDelivery.Models
{
public class Oferta
{
public int OfertaID { get; set; }
public string Nombre { get; set; }
public string Imagen { get; set; }
public int ComercioID { get; set; }
}
}
控制器(显示部分代码):
public Oferta Add(Oferta item)
{
/*here my item will have the POST body with form values,
automatically serialized by the framework and I think an image binary*/
var n = item.Nombre; //...etc.
}
简而言之,您必须将数据作为multipart/form-data
发送(我敢肯定,您已经通过您提到的插件进行了发送),然后您必须使用Web API MultipartContent
提供程序之一提取该数据。
有很多资源可以解释如何做到这一点:
- 文件上载和多部分MIME
- ASP.NET Web API:文件上载和多部分MIME
- ASP.NET Web API RTM中异步文件上载指南
我也实现了
这是我的上传用户类别
public class UploadUserFile
{
string _Token;
string _UserId;
string _IPAddress;
string _DeviceInfo;
string _FileName;
string _ContentType;
Stream _PhotoStream;
public string Token
{
get
{
return _Token;
}
set
{
_Token = value;
}
}
public string UserId
{
get
{
return _UserId;
}
set
{
_UserId = value;
}
}
public string IPAddress
{
get
{
return _IPAddress;
}
set
{
_IPAddress = value;
}
}
public string DeviceInfo
{
get
{
return _DeviceInfo;
}
set
{
_DeviceInfo = value;
}
}
public string FileName
{
get
{
return _FileName;
}
set
{
_FileName = value;
}
}
public string ContentType
{
get
{
return _ContentType;
}
set
{
_ContentType = value;
}
}
public Stream PhotoStream
{
get
{
return _PhotoStream;
}
set
{
PhotoStream = value;
}
}
}
这是我的API控制器类
public class UploadUserPhotoController : ApiController
{
/// <summary>
/// </summary>
/// <param name="request">
/// HttpRequestMessage, on the other hand, is new in .NET 4.5.
/// It is part of System.Net.
/// It can be used both by clients and services to create, send and receive requests and
/// responses over HTTP.
/// It replaces HttpWebRequest, which is obsolete in .NET 4.5
/// </param>
/// <returns>return the response of the Page <returns>
[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
var httpRequest = HttpContext.Current.Request;
var UploadUserFileObj = new UploadUserFile
{
Token = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "Token").FirstOrDefault().Value.ToString(),
UserId = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "UserId").FirstOrDefault().Value.ToString(),
IPAddress = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "IPAddress").FirstOrDefault().Value.ToString(),
ContentType = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "ContentType").FirstOrDefault().Value.ToString(),
DeviceInfo = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "DeviceInfo").FirstOrDefault().Value.ToString(),
FileName = request.GetQueryNameValuePairs().AsEnumerable().Where(x => x.Key == "FileName").FirstOrDefault().Value.ToString()
};
Stream requestStream = await request.Content.ReadAsStreamAsync();
HttpResponseMessage result = null;
if (requestStream!=null)
{
try
{
if(string.IsNullOrEmpty(UploadUserFileObj.FileName))
{
UploadUserFileObj.FileName = "DefaultName.jpg";
}
// Create a FileStream object to write a stream to a file
using (FileStream fileStream = System.IO.File.Create(HttpContext.Current.Server.MapPath("~/locker/" + UploadUserFileObj.FileName), (int)requestStream.Length))
{
// Fill the bytes[] array with the stream data
byte[] bytesInStream = new byte[requestStream.Length];
requestStream.Read(bytesInStream, 0, (int)bytesInStream.Length);
// Use FileStream object to write to the specified file
fileStream.Write(bytesInStream, 0, bytesInStream.Length);
result = Request.CreateResponse(HttpStatusCode.Created, UploadUserFileObj.FileName);
}
}
catch (HttpException ex)
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway,"Http Exception Come"+ ex.Message);
}
catch(Exception ex)
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway, "Http Exception Come" + ex.Message);
}
}
else
{
return result = Request.CreateResponse(HttpStatusCode.BadGateway, "Not eble to upload the File ");
}
return result;
}
}
在这个代码中,我使用
在clinet到服务器服务器到客户端之间传输数据的HttpRequestMessage。