UWP 使用OneDrive云存储2.x api(二)【全网首发】

接上一篇 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,两种上传方式,用我的代码判断一下即可。

具体为啥区分,请去看官方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】场景里面使用的实际代码分享,如有不足之处,敬请指正。谢谢。

时间: 2024-10-15 20:07:15

UWP 使用OneDrive云存储2.x api(二)【全网首发】的相关文章

UWP 使用OneDrive云存储2.x api(一)【全网首发】

最近开发人脸识别UWP[微识别 / WeRecognition]用到了OneDrive开发,下面把来龙去脉讲一下. 下载地址 https://www.microsoft.com/store/productId/9PDSNS7X9ST9,商店火爆热销中...... 由于UWP是跨平台的,一套代码可以运行在所有Windows 10设备上,比如手机.电脑.全息.Hub.Xbox等. 那么问题就来了,既然App可以跨屏台运行,那么为了给用户打造一个完全无缝衔接的最佳体验,UWP开发者最好也要实现App设

Java使用百度云存储BCS-让你的数据下载飞起来

一.简介 云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云.国内的云服务商还是有很多了,主要有两大类,一类是类似于阿里云的类主机型的云提供商,比如万网等传统空间商转过来的:还有一类是应用应用托管平台,比如BAE,SAE.相对于阿里云等空间商之类的来说,应用托管平台的入门更低,为广大的苦逼程序猿提供了一个好的测试平台. 我最近负责的软件升级程序,多平台多文件多版本,如果是自己架构文件服务器带宽肯定不能满足业务需求,于是上手百度云存储BCS服务,现在使

升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)

      Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序

云存储:文件的上传

大型网站架构:降低主站服务器的压力 CDN:智能DNS挑选最近的服务器提供图片等 云存储:把图片放到单独的服务器,价格低 云存储:七牛.AWS.又拍云.盛大云.阿里云.百度云 云计算:租.按需使用.按需付费 又拍云:帐号注册--操作空间 上传: ftp:// 登录 http:// 下载SDK 问题:把上传的文件不存在当前应用程序某个文件夹下,而是直接存到云存储,并返回一个云服务器的路径 ---??? 步骤:注册-ftp上传-http上传(下载SDK-demo示例)-保存到云上.返回云路径 pub

(转)云存储:阿里云OSS 、又拍云和 七牛 的比较

阿里OSS:好处就是,那是一套完整的体系,存储,数据库,CDN,服务器,阿里都可以给你全包.缺点,费用对于没有盈利的网站来说太高了,好像定位就是给那些高端客户使用的,而且CDN,OSS的流量是分开收费,带宽(2倍成本,呵呵).又拍云:算是老牌静态存储服务商,自带有CDN.存储空间可以弹性增加(不知道可不可以弹性减少,我只是免费使用了一下).费用计算公式(空间和流量),请求次数是免费.可免费试用7天.开源的程序(DZ,PW,WP)都有插件,也可以直接使用FTP,对于技术上要求不是太高就可以使用.七

云存储“T时代”:云空间推出1T免费空间

云存储“T时代”:云空间推出1T免费空间 近日,云空间今日宣布旗下免费云将免费赠送用户1T永久免费空间,用户只需简单操作就可获得总容量超过1T的免费云空间服务,这也标志着免费空间正式进入“T时代”.云空间也是目前唯一容量超过1T的免费空间. 目前,用户只需登陆云空间官方网站( http://www.616191.com/ ),便可以获得1T免费空间. 在率先解决存储空间问题后,云空间为了给用户提供更加快速.安全.稳定的云服务,还全面推出“五大防护功能”——防窃听,防偷窥,防盗号,防病毒,防损毁.

1T永久空间免费送 云空间盘开启云存储全民T时代

在近日召开的世界互联网大会上,云空间宣布开放免费1TB云空间. 意味着所有云空间用户,可以不花一分钱就获得1TB的超大存储空间! 据业内人士分析,云空间此次活动的真实目的是为了推广其自家云系统,直接免费1T.云空间这次依旧是业内最大的手笔! 所有用户只要简单三步,便可获得云空间提供的超大永久免费云空间.网友通过PC登陆云空间(http://www.616191.com/ )便可以获得1T费空间 . “曾经省吃俭用就为了凑钱买块台服务器.如今,云空间就可以提供超大容量而且永久免费云空间!”云空间大

ueditor上传图片到七牛云存储(form api,java)

转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 Let's rock 与ueditor结合前的准备工作 首先从表单开始 生成token 建立图片空间 生成token 上传流程 集成ueditor 将ueditor中的图片模块的在线管理功能和七牛结合 ueditor上传图片到七牛云存储 重要说明,本人已不做java多年,请不要加qq再问我java的

亚马逊云存储签名算法问题

最近在研究云存储. 如果没有相关背景知识的朋友,请先百度. 我首先要说的是是签名算法错误问题,可能是他们网站内容错误,请核查. 如下. http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html 样例网站如下: http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 我采用三方在线加密网站,算出来的密码与AM