2014-01-20 83 views
0

我知道這已被問到,但標記的解決方案不正確。通常這篇文章被標記爲解決方案:http://blogs.msdn.com/b/kwill/archive/2013/03/06/asynchronous-parallel-block-blob-transfers-with-progress-change-notification-2-0.aspx獲取Azure Blob上的實際上傳進度

它的工作原理,並給出一個實際的進展,但沒有實時的進步(以及在某些情況下,它給出了一個完全錯誤的)。讓我來解釋:

它提供了有關本地讀緩衝區的進展,所以,當我上傳有我的第一個「上傳值」是讀緩衝區總大小。在我的情況下,這個緩衝區是4mb,所以每個小於4mb的文件的結果在0秒內完成進度條,但它需要真正的上傳時間才能完成。另外,如果你試圖在上傳開始之前殺死你的連接,它會給出第一個緩衝區大小的實際進度,所以對於我的1mb文件,我得到100%進度,而斷開

我發現另一篇文章中有另一種解決方案,它讀取來自蔚藍每次HTTP響應它完成單塊上傳,但我需要我的塊是4MB(因爲單個文件最大模塊數爲50.000)和即使塊尺寸較小,它也不是完美的解決方案。

的第一篇文章覆蓋了流類,並創建一個ProgressStream類與每觸發一個讀完成時間ProgressChanged事件,有一些方法來知道實際上傳字節時ProgressChanged被觸發?

+0

請問你能解釋一下你的意思嗎?'但是我需要我的塊爲4mb(因爲單個文件的最大塊數是50.000),即使塊大小很低,它也不是一個完美的解決方案? –

+0

@GauravMantri我的意思是,因爲我可以知道塊上傳是否完成,如果我上傳塊大小爲250kb(例如),我可以知道上傳進度爲250kb的錯誤(仍然不可接受)。另外,單個塊blob最多可以有50.000個塊,所以我的最大單個文件大小變爲250kb * 50.000 = 12.5gb(不是最優)。塊越小,精度越好,但最大文件變得越小:( – HypeZ

回答

2

您可以使用與http://blogs.msdn.com/b/kwill/archive/2011/05/30/asynchronous-parallel-block-blob-transfers-with-progress-change-notification.aspx(引用的博客文章的版本1.0)類似的代碼來完成此操作,但不是調用m_Blob.PutBlock,而是使用HTTPWebRequest對象上載該塊,並使用HTTPWebRequest中的進度事件類。這引入了更多的代碼複雜度,你將不得不添加一些額外的錯誤處理。

另一種方法是從GitHub下載Storage Client Library源代碼並修改塊上傳方法以跟蹤和報告進度。您將面臨的挑戰是,如果您計劃瞭解最新的修補程序,您將不得不對每個新版本的SCL進行相同的更改。

+0

對不起,如果我等待標記爲解決方案之前,我需要一些時間才能成功實現它!我使用了你的第一個解決方案並且工作得很好,現在我可以看到我的進度條的正確值和感覺就像我有100%的控制上傳發生了什麼:)當然,embeeded天藍色sdk方法真的更容易實現,但現在我有我想要的結果:)謝謝! – HypeZ