2013-03-11 54 views
7

我使用下面的代碼從URL下載的圖像下載網址從圖像並不總是保存整個圖像(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()); 
     } 

一些用戶報告說,它並不總是下載整個圖像。他們有時會得到部分圖像,其餘的只是垃圾。

這是否有任何理由? 謝謝!

+1

你需要刷新/關閉/處理目標流/文件嗎? – 2013-03-11 14:49:24

+0

我不確定。我認爲使用塊將爲我照顧。但我會試一試。不幸的是,我不能重現這個問題,所以我輸入的任何「修復」都將是盲目的。 剛剛意識到流不在使用塊 – Smeegs 2013-03-11 14:50:44

+0

@Javalsu文檔對於從Client.GetStreamAsync返回的流上的Dispose方法做了什麼說明。有些流需要刷新,其他流不需要 – 2013-03-11 14:53:51

回答

7

我會建議使用DownloadData或DownloadDataAsync方法嘗試WebClient類。

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

編輯如果流是給你,你可以使用字節數組,而不是響應麻煩。您的「使用」語句與內部的異步代碼可能會導致它提前處置,也許?

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

感謝您的建議,但我不相信這在Winrrt中有效。 – Smeegs 2013-03-11 15:00:40

+0

@Javalsu - 我認爲這個問題可能是「using」語句過早地處理對象,或者HttpClient的流/完成問題。我編輯了我的答案,以反映「可能」更穩定的解決方案。 – 2013-03-11 15:38:14

+0

感謝您的回覆。迄今爲止這麼好,沒有問題。 – Smeegs 2013-03-11 15:42:42

2

BackgroundDownloader是下載文件最簡單的方法。

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

感謝您的建議,不幸的是我已經嘗試過這種方法,它並沒有爲我工作。我的應用程序有很多在後臺運行的進程,看起來這個方法必須等待所有其他進程結束才能啓動。所以我無法使用它。 – Smeegs 2013-05-02 12:14:22

+0

即使在StartAsync()處有一個等待並且在下載功能處有一個等待處理? – akhansari 2013-05-02 13:46:59

+0

是的,這是非常令人困惑的,它會衝擊等待線,永遠不會進步。我開始討論微軟論壇,並就如何阻止其開始的其他進程達成共識。 我無法確認這是真正的原因,但沒有任何建議可以使它工作。 – Smeegs 2013-05-02 15:11:57

相關問題