2013-02-06 112 views
7

我目前正在使用Web API开发REST Web服务。我遇到了处理二进制数据(一个图像),通过POST请求传输的问题。从POST或PUT REST请求处理Web API中的二进制数据

从客户端的角度来看,我设法使用jQuery表单插件发送二进制数据。但是因为我对.NET很陌生(我是一名PHP开发人员),所以我很难通过服务器上的Web API处理这些二进制数据。

为了确认jQuery表格插件正确发送图像数据,我写了一个工作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

参见http://stackoverflow.com/a/967101/955881 – drch

回答

1

我已经实现

同样的事情这是我上传的用户类

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为客户为例之间传送数据到服务器服务器到客户端。