2015-06-30 30 views
6

Attualmente sto lavorando su un'API web C#. Per una chiamata specifica devo inviare 2 immagini utilizzando una chiamata ajax all'API, in modo che l'API possa salvarle come varbinary (max) nel database.Converti HttpContent in byte []

  1. Come si fa a estrarre un Image o byte[] da un oggetto HttpContent?
  2. Come si esegue questa operazione due volte? Una volta per ogni immagine.

-

var authToken = $("#AuthToken").val(); 
var formData = new FormData($('form')[0]); 
debugger; 
$.ajax({ 
    url: "/api/obj/Create/", 
    headers: { "Authorization-Token": authToken }, 
    type: 'POST', 
    xhr: function() { 
     var myXhr = $.ajaxSettings.xhr(); 
     return myXhr; 
    }, 
    data: formData, 
    cache: false, 
    contentType: false, 
    processData: false 
}); 

-

public async Task<int> Create(HttpContent content) 
{ 
    if (!content.IsMimeMultipartContent()) 
    { 
     throw new UnsupportedMediaTypeException("MIME Multipart Content is not supported"); 
    } 

    return 3; 
} 

risposta

1
if (!content.IsMimeMultipartContent()) 
{ 
    throw new UnsupportedMediaTypeException("MIME Multipart Content is not supported"); 
} 

var uploadPath = **whatever**; 
if (!Directory.Exists(uploadPath)) 
{ 
    Directory.CreateDirectory(uploadPath); 
} 

var provider = new MultipartFormDataStreamProvider(uploadPath); 
await content.ReadAsMultipartAsync(provider); 

return File.ReadAllBytes(provider.FileData[0].LocalFileName); 
0

Si prega di guardare il metodo copyToAsync (Stream, TransportContext) esposto da ByteArrayContent classe. [msdn link]

+0

Sto cercando una risposta con un po 'più in dettaglio, forse un esempio –

13

HttpContent ha un metodo Async che restituiscono ByteArray cioè (Task di ByteArray)

Byte[] byteArray = await Content.ReadAsByteArrayAsync(); 

È possibile eseguire il metodo sincrono

Byte[] byteArray = Content.ReadAsByteArrayAsync().Result; 
+0

Ciò restituisce un bel lungo byte [], ma ho due immagini separate Devo estrarre –

0

È possibile utilizzare HttpContent.ReadAsByteArrayAsync:

byte[] bytes = await response.Content.ReadAsByteArrayAsync(); 

Oppure puoi leggere il contenuto con HttpContent.ReadAsStreamAsync ed estratto a un byte[] da lì:

var stream = response.Content.ReadAsStreamAsync(); 
using (var memoryStream = new MemoryStream()) 
{ 
     await stream.CopyToAsync(stream); 
     return memoryStream.ToArray(); 
} 
+0

"Impossibile risolvere il simbolo .CopyToAsync" –

+0

@James In quale versione .NET sei? –

+0

Sto usando .NET 4.5 –