標籤:eid 一個 alt cloud 上傳下載 ror wait 最好 backup
接上一篇 http://www.cnblogs.com/hupo376787/p/8032146.html
上一篇提到為了給使用者打造一個完全無縫銜接的最佳體驗,UWP開發人員最好也要實現App設定和資料的跨平台
分析了數據漫遊和OneDrive的優缺點,結合自己App實際需要,我選擇了OneDrive。
畢竟數據漫遊100KB不夠用啊。。。
這一次給大家我千辛萬苦找來的、非常簡單的使用OneDrive 2.x api使用方法。
那就是隱藏在官方UWP Community Toolkit Sample App中的OneDrive Service中
我覺得平時我看這個App已經夠多了,以前也瞄過一眼這個OneDrive Service,但是在真真使用它的時候,偏偏想不起來了。
我用過這裡面的Grid Splitter、Markdown Textbox、RadialProgressBar、等等太多了
這是一個非常好的例子,商店有下載,gayhub也有原始碼
不得不說,微軟開發這個App的人員非常偉大了。。。哈哈哈??
下面就結合我自己的【微識別/WeRecognition】代碼來和大家說一下。
1. 授權
要訪問OneDrive,首先需要授權。
授權有三種方式:
OnlineId,最簡單,我就用這個,也是推薦UWP開發人員使用的
Microsoft account with client id
Work or school account with client id
private OneDriveStorageFolder _appFolder = null;這個用來擷取OneDrive下面的應用檔案夾
private async Task SigninAsync(int indexProvider = 0, string appClientId = null) { if (!IsInternetAvailable()) return; ShowBusy(true); try { // OnlineId if (indexProvider == 0) { OneDriveService.Instance.Initialize(); } //Microsoft account with client id else if (indexProvider == 1) { OneDriveService.Instance.Initialize(appClientId, AccountProviderType.Msa, OneDriveScopes.AppFolder | OneDriveScopes.ReadWrite); } //Work or school account with client id else if (indexProvider == 2) { OneDriveService.Instance.Initialize(appClientId, AccountProviderType.Adal); } if (await OneDriveService.Instance.LoginAsync()) { _appFolder = await OneDriveService.Instance.AppRootFolderAsync(); ShowBusy(false); } else { ShowBusy(false); throw new Exception("Unable to sign in"); } } catch (ServiceException serviceEx) { var dialog = new MessageDialog(serviceEx.Message, "Error!"); await dialog.ShowAsync(); ShowBusy(false); } catch (Exception ex) { var dialog = new MessageDialog(ex.Message, "Error!"); await dialog.ShowAsync(); ShowBusy(false); } finally { ShowBusy(false); } }
注意:用的時候,最好加上上面捕捉的那些異常,以防萬一。
接下來無非就是,上傳下載檔案咯。【我沒有做別的一些操作,比如在OneDrive上建立檔案(夾),或者縮圖等,你可以自行看那個App說明】
我不想把簡單的事情搞得複雜,這個團隊做的也是這樣,能簡單就簡單。不信你上傳的代碼
上傳
var size = await file.GetBasicPropertiesAsync(); if (size.Size >= 4 * 1024 * 1024) await OneDriveServiceHelper.UploadLargeFileAsync(file, strBackupName, CreationCollisionOption.ReplaceExisting, _appFolder); else await OneDriveServiceHelper.UploadSimpleFileAsync(file, strBackupName, CreationCollisionOption.ReplaceExisting, _appFolder);
不過這要區分一下是不是超過4M,兩種上傳方式,用My Code判斷一下即可。
具體為啥區分,請去看官方gayhub上面的Issues討論。
兩個函數的原型
UploadSimpleFileAsync
public static async Task UploadSimpleFileAsync(OneDriveStorageFolder folder) { try { if (folder != null) { var selectedFile = await OpenLocalFileAsync(); if (selectedFile != null) { using (var localStream = await selectedFile.OpenReadAsync()) { var fileCreated = await folder.CreateFileAsync(selectedFile.Name, CreationCollisionOption.GenerateUniqueName, localStream); } } } } catch (OperationCanceledException ex) { await OneDriveServiceHelper.DisplayMessageAsync(ex.Message); } catch (ServiceException graphEx) { await OneDriveServiceHelper.DisplayMessageAsync(graphEx.Error.Message); } catch (Exception ex) { await OneDriveServiceHelper.DisplayMessageAsync(ex.Message); } finally { } }
UploadLargeFileAsync
public static async Task UploadLargeFileAsync(OneDriveStorageFolder folder) { try { if (folder != null) { var selectedFile = await OpenLocalFileAsync(); if (selectedFile != null) { using (var localStream = await selectedFile.OpenReadAsync()) { // If the file exceed the Maximum size (ie 4MB) var largeFileCreated = await folder.UploadFileAsync(selectedFile.Name, localStream, CreationCollisionOption.GenerateUniqueName, 320 * 1024); } } } } catch (OperationCanceledException ex) { await OneDriveServiceHelper.DisplayMessageAsync(ex.Message); } catch (ServiceException graphEx) { await OneDriveServiceHelper.DisplayMessageAsync(graphEx.Error.Message); } catch (Exception ex) { await OneDriveServiceHelper.DisplayMessageAsync(ex.Message); } finally { } }
你可能注意到了,官方的函數參數和我用的不一樣,是的。我重新封裝了。
官方的是var selectedFile = await OpenLocalFileAsync();,需要手動選擇檔案。在我的情境裡面,是自動選擇資料庫檔案上傳的,讓使用者選擇,就不合適了
下載
var remoteFile = await _appFolder.GetFileAsync(strBackupName); using (var remoteStream = await remoteFile.OpenAsync()) { byte[] buffer = new byte[remoteStream.Size]; var localBuffer = await remoteStream.ReadAsync(buffer.AsBuffer(), (uint)remoteStream.Size, InputStreamOptions.ReadAhead); var localFolder = ApplicationData.Current.LocalFolder; var myLocalFile = await localFolder.CreateFileAsync(SQLiteHelper.FaceDbName, CreationCollisionOption.ReplaceExisting);using (var localStream = await myLocalFile.OpenAsync(FileAccessMode.ReadWrite)) { await localStream.WriteAsync(localBuffer); await localStream.FlushAsync(); TipServices.TipDataDownloadFromCloudComplete(); }
下載不區分什麼大小檔案,很簡單的
=================================================================================
總結
UWP本來就是小眾,資料少之又少,我走過了坑,記錄下來,對以後用到OneDrive 開發的有所協助。
使用OneDrive Api 2.x流程如下
- 註冊應用以擷取應用 ID。
- 使用令牌流或代碼流通過指定的範圍讓使用者登入。就是上面的 SigninAsync函數
- 上傳下載操作
- 登出使用者(可選)。
以上就是在我的【微識別/WeRecognition】情境裡面使用的實際代碼分享,如有不足之處,敬請指正。謝謝。
UWP 使用OneDrive雲端儲存2.x api(二)【全網首發】