UWP 使用OneDrive雲端儲存2.x api(二)【全網首發】

來源:互聯網
上載者:User

標籤: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流程如下 

  1. 註冊應用以擷取應用 ID。
  2. 使用令牌流或代碼流通過指定的範圍讓使用者登入。就是上面的 SigninAsync函數
  3. 上傳下載操作
  4. 登出使用者(可選)。

 

 

 

以上就是在我的【微識別/WeRecognition】情境裡面使用的實際代碼分享,如有不足之處,敬請指正。謝謝。

UWP 使用OneDrive雲端儲存2.x api(二)【全網首發】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.