UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件
Posted hupo376787
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件相关的知识,希望对你有一定的参考价值。
上一年年底写过两篇文章
UWP 使用OneDrive云存储2.x api(一)【全网首发】
UWP 使用OneDrive云存储2.x api(二)【全网首发】
没想到半年之后,VS编译提示方法已经过时了,可见微软朝三暮四,气走开发者的传言,并不假??????
不过新升级后的OneDrive service更加好用了,但是我没感觉出来??????
下面就来和大家分享一下新版的使用方法。
要把大象装,啊呸,哪有大象??了。要想使用OneDrive API,拢共分三步???
1. 注册应用程序ID
2. 授权程序功能
3. 使用OneDrive API
好吧,开始
1. 注册应用程序ID
去 https://apps.dev.microsoft.com/,在已聚合的应用旁边,选择添加应用,按照向导走,注意选择“Mobile and Desktop App”.
完成之后应该就有下图了。
注意记住这个应用ID,一会要用到。最好的办法就是收藏一下这个页面咯。
2. 授权程序功能
打开 Package.appxmanifest,进入“功能”页面,勾选 ?专用网络(客户端和服务端)。如图
3. 使用OneDrive API
3.0 下载NuGet包
打开NuGet,搜索Microsoft.Toolkit.Uwp.Services,安装3.0版本或以上。
友情提示:4.0还有可能会变哦
3.1 初始化
一句话搞定
string[] scopes = new string[] { MicrosoftGraphScope.FilesReadWriteAppFolder};
OneDriveService.Instance.Initialize("刚才申请的那个应用ID", scopes, null, null);
scopes是使用的权限,我的App只需要使用OneDrive下的应用程序文件夹,所以就是这个了。当然还有其它的权限,比如 Files.Read.All,Files.ReadWrite.All等,详见MicrosoftGraphScope下面的枚举。
3.2 登录
核心也是一句话
if (await OneDriveService.Instance.LoginAsync()) { OneDriveStorageFolder oneDriveAppFolder = await OneDriveService.Instance.AppRootFolderAsync(); TipServices.TipAuthenticateSuccess(); } else { TipServices.TipAuthenticateFail(); throw new Exception("Unable to sign in"); }
在登录成功后,我马上获取了OneDrive下面的应用程序文件夹。别的文件夹坚决不访问,不做流氓行为。坚决不向BAT看齐。
3.3 获取文件
循环获取
var OneDriveItems = await folder.GetItemsAsync(); do { OneDriveItems = await folder.NextItemsAsync(); } while (OneDriveItems != null);
3.4 创建文件夹
string newFolderName = await OneDriveSampleHelpers.InputTextDialogAsync("New Folder Name"); if (!string.IsNullOrEmpty(newFolderName)) { await folder.StorageFolderPlatformService.CreateFolderAsync(newFolderName, CreationCollisionOption.GenerateUniqueName); }
3.5 进入子文件夹
var currentFolder = await _graphCurrentFolder.GetFolderAsync(item.Name); OneDriveItemsList.ItemsSource = await currentFolder.GetItemsAsync(20); _graphCurrentFolder = currentFolder;
3.6 移动、复制、重命名项目
await _onedriveStorageItem.MoveAsync(targetonedriveStorageFolder); await _onedriveStorageItem.CopyAsync(targetonedriveStorageFolder); await _onedriveStorageItem.RenameAsync("NewLevel3");
3.7 创建/上传小于4M的文件
var selectedFile = await OpenLocalFileAsync(); if (selectedFile != null) { using (var localStream = await selectedFile.OpenReadAsync()) { var fileCreated = await folder.StorageFolderPlatformService.CreateFileAsync(selectedFile.Name, CreationCollisionOption.GenerateUniqueName, localStream); } }
3.8 创建/上传大于4M的文件
var selectedFile = await OpenLocalFileAsync(); if (selectedFile != null) { using (var localStream = await selectedFile.OpenReadAsync()) { Shell.Current.DisplayWaitRing = true; // If the file exceed the Maximum size (ie 4MB) var largeFileCreated = await folder.StorageFolderPlatformService.UploadFileAsync(selectedFile.Name, localStream, CreationCollisionOption.GenerateUniqueName, 320 * 1024); } } }
至于为什么非要区分,而且是4M为分界线,我也不清楚。好像GayHub上讨论过,有兴趣可以去查下。
3.9 下载文件
var oneDriveFile = (Toolkit.Services.OneDrive.OneDriveStorageFile)item; using (var remoteStream = (await oneDriveFile.StorageFilePlatformService.OpenAsync()) as IRandomAccessStream) { await SaveToLocalFolder(remoteStream, oneDriveFile.Name); }
3.10 获取缩略图
var file = (Toolkit.Services.OneDrive.OneDriveStorageItem)((AppBarButton)e.OriginalSource).DataContext; using (var stream = (await file.StorageItemPlatformService.GetThumbnailAsync(Toolkit.Services.MicrosoftGraph.MicrosoftGraphEnums.ThumbnailSize.Large)) as IRandomAccessStream) { await OneDriveSampleHelpers.DisplayThumbnail(stream, "thumbnail"); }
关于OneDrive的API操作基本都在这了。
如果你觉得微软的OneDrive客户端非常渣渣,那么看完这个,你也完全可以写一个OneDrive 的App,然后发布到商店。
到时别忘记@我一下,我也用用。
以上是关于UWP 使用Windows Community Toolkit 的OneDrive service上传下载文件的主要内容,如果未能解决你的问题,请参考以下文章
Windows Community Toolkit 3.0 - InfiniteCanvas
华为云技术分享New UWP Community Toolkit - ImageEx
New UWP Community Toolkit - DropShadowPanel