2013-02-06 16 views
7

Attualmente sto sviluppando un servizio Web REST utilizzando l'API Web . Ho riscontrato un problema nell'elaborazione dei dati binari (un'immagine) che è stata trasmessa tramite una richiesta POST.Elaborazione di dati binari in API Web da una richiesta POST o PUT REST

Dal punto di vista del client, sono riuscito a inviare dati binari utilizzando il plug-in jQuery . Ma poiché sono molto nuovo su .NET (sono uno sviluppatore PHP), ho difficoltà a elaborare questi dati binari tramite l'API Web sul server.

Per confermare che il modulo di plugin jQuery sta inviando correttamente i dati di immagine, ho scritto un lavoro PHP gestore che fa uso della semplice variabile globale $_FILE.

Ora sto cercando di ottenere lo stesso tramite l'API Web. Ecco uno schema di ciò che ho provato. Come accedere ai dati binari che sono stati inviati?

Modello:

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 (codice parziale mostrato):

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

vedere http://stackoverflow.com/a/967101/955881 – drch

risposta

1

La stessa cosa che ho raggiunto

Questo è il mio utente di upload Classe

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; 
     } 
    } 

} 

Questo è il mio API classe Controller

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 questo codice sto usando la

HttpRequestMessage per i dati trasferiti tra clinet al server server al client.

Problemi correlati