我目前正在使用 Web API 开发 REST Web服务。我在处理通过POST请求传输的二进制数据(图像)时遇到问题。
从客户端的角度来看,我已经设法使用 jQuery Form Plugin 发送二进制数据。但是因为我是.NET的新手(我是PHP开发人员),我在服务器上通过Web API处理这个二进制数据时遇到了困难。
为了确认jQuery Form Plugin正在正确发送图像数据,我编写了一个有效的 PHP 处理程序,它使用了简单的$_FILE
全局变量。
现在我正在尝试通过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.
}
答案 0 :(得分:9)
简而言之,您必须将数据发送为multipart/form-data
(我很确定,您已经通过您提到的插件进行了处理),然后您必须使用Web API之一提取数据MultipartContent
个提供商。
有很多资源解释如何:
答案 1 :(得分:2)
我取得了同样的成就
这是我的上传用户类
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;
}
}
在此代码中我使用的是
HttpRequestMessage用于将clinet与服务器服务器之间的传输数据传输到客户端。