I'm currently developing a REST web service using Web API. I have encountered a problem processing binary data (an image) that has been transmitted via a POST request.
From the perspective of the client, I have managed to send binary data using the jQuery Form Plugin. But because I'm very new to .NET (I'm a PHP developer), I'm having difficulty processing this binary data via Web API on the server.
To confirm that the jQuery Form Plugin is sending the image data correctly, I have written a working PHP handler that makes use of the simple $_FILE
global variable.
Now I am trying to accomplish the same via Web API. Here is an outline of what I have tried. How do I access the binary data that has been sent?
Model:
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; }
}
}
Controller (partial code shown):
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.
}
In short, you have to send the data as multipart/form-data
(which, I'm pretty sure, you are already doing through the plugin you mentioned) and then you have to extract that data using one of Web API MultipartContent
providers.
There are plenty of resources explaining how to that:
The same thing I have achieved
This is my upload user Class
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;
}
}
}
This is my API Controller class
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;
}
}
In this code I am using the
HttpRequestMessage for Transferred data between clinet to server server to client.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With