2013-03-11 26 views
7

Sto utilizzando il seguente codice per scaricare un'immagine da un URLDownload immagine da URL non sempre salva l'intera immagine (WinRT)

HttpClient client = new HttpClient(); 
     var stream = await client.GetStreamAsync(new Uri("<your url>")); 
     var file = await KnownFolders.PictureLibrary.CreateFileAsync("myfile.png"); 
     using (var targetStream = await file.OpenAsync(FileAccessMode.ReadWrite)) 
     { 
      using (stream) 
       await stream.CopyToAsync(targetStream.AsStreamForWrite()); 
     } 

diversi utenti hanno segnalato che non sempre scaricare l'intera immagine. Che a volte ottengono immagini parziali e il resto è solo spazzatura.

C'è qualche motivo per questo? Grazie!

+1

Avete bisogno di svuotare/chiudere/smaltire il flusso/file di destinazione? –

+0

Non ne sono sicuro. Ho pensato che il blocco di utilizzo si sarebbe occupato di quello per me. Ma farò una prova. Purtroppo non riesco a ricreare il problema, quindi qualsiasi "correzione" che ho inserito sarà cieca. Appena realizzato lo stream NON è in un blocco using – Smeegs

+0

@Javalsu cosa dice la documentazione sul metodo Dispose nello stream che viene restituito da Client.GetStreamAsync. Alcuni flussi devono essere svuotati e altri non lo fanno –

risposta

7

Suggerirei di provare la classe WebClient con il metodo DownloadData o DownloadDataAsync.

File.WriteAllBytes("myfile.png", 
    new WebClient().DownloadData("<your url>")); 

modificare Se il flusso si sta dando problemi è possibile utilizzare la risposta array di byte, invece. La tua frase "using" con codice async all'interno potrebbe causarne l'eliminazione anticipata, forse?

var httpClient = new HttpClient(); 
var data = await httpClient.GetByteArrayAsync(new Uri("<Your URI>")); 
var file = await KnownFolders.PictureLibrary.CreateFileAsync("myfile.png"); 
var targetStream = await file.OpenAsync(FileAccessMode.ReadWrite) 
await targetStream.AsStreamForWrite().WriteAsync(data, 0, data.Length); 
targetStream.FlushAsync().Wait(); 
targetStream.Close(); 
+0

Grazie per il suggerimento, ma non credo che funzioni in Winrrt. – Smeegs

+0

@ Javalsu - Penso che il problema sia probabilmente con l'istruzione "using" che elimina l'oggetto troppo presto o un problema di streaming/completamento con HttpClient. Ho modificato la mia risposta in modo da riflettere una soluzione "possibilmente" più stabile per te. –

+0

Grazie per la risposta. Fin qui tutto bene, nessun problema. – Smeegs

2

BackgroundDownloader è il modo più semplice per scaricare un file.

using Windows.Storage; 

public async Task DownloadPhoto(Uri uri) 
{ 
    var folder = ApplicationData.Current.LocalFolder; 
    var photoFile = await folder.CreateFileAsync("photo.jpg", CreationCollisionOption.ReplaceExisting); 
    var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader(); 
    var dl = downloader.CreateDownload(uri, photoFile); 
    await dl.StartAsync(); 
} 
+0

Grazie per i suggerimenti, purtroppo ho provato questo metodo e non ha funzionato per me. La mia app ha molti processi che vengono eseguiti in background e sembra che questo metodo debba attendere che tutti gli altri processi finiscano prima di poter essere avviato. Quindi non ero in grado di usarlo. – Smeegs

+0

Anche in attesa di StartAsync() e di una funzione di attesa per il download? – akhansari

+0

Sì, era molto confuso, avrebbe colpito la linea di attesa e non avrebbe mai progredito. Ho iniziato una discussione sul forum microsoft e il consenso su ciò che avevo altri processi che impedivano l'avvio. Non ho potuto confermare che quella fosse la vera causa, ma nulla di ciò che è stato suggerito avrebbe funzionato. – Smeegs