2

ユーザーが Google ドライブ アカウントにファイルをアップロードできるようにするプログラムを作成しています。アップロード部分が機能しており、OAuth2 を使用しています。私が現在抱えている問題は、ユーザーのドライブ アカウントからフォルダーのリストを取得することです。

.setUserCredentials メソッドを使用してこれを行うはずのコードを見つけましたが、機能しません。

DocumentsService service1 = new DocumentsService("project");            
        service1.setUserCredentials("user","pass");

        FolderQuery query1 = new FolderQuery();

        // Make a request to the API and get all documents.
        DocumentsFeed feed = service1.Query(query1);

        // Iterate through all of the documents returned
        foreach (DocumentEntry entry in feed.Entries)
        {
            var blech = entry.Title.Text;
        }

何も返されません。理想的には、これを行うために OAuth2 を使用したいと考えています。認証トークンを設定しようとして、次のコードを試してみましたが、常にアクセスが拒否されます。

String CLIENT_ID = "clientid";
String CLIENT_SECRET = "secretid";

var docprovider = new NativeApplicationClient(GoogleAuthenticationServer.Description, CLIENT_ID, CLIENT_SECRET);
var docstate = GetDocAuthentication(docprovider);

DocumentsService service1 = new DocumentsService("project");

service1.SetAuthenticationToken(docstate.RefreshToken);
FolderQuery query1 = new FolderQuery();

DocumentsFeed feed = service1.Query(query1); //get error here

        // Iterate through all of the documents returned
        foreach (DocumentEntry entry in feed.Entries)
        {
            // Print the title of this document to the screen
            var blech = entry.Title.Text;
        }

..

    private static IAuthorizationState GetDocAuthentication(NativeApplicationClient client)
    {
        const string STORAGE = "storagestring";
        const string KEY = "keystring";
        string scope = "https://docs.google.com/feeds/default/private/full/-/folder";            
        // Check if there is a cached refresh token available.
        IAuthorizationState state = AuthorizationMgr.GetCachedRefreshToken(STORAGE, KEY);
        if (state != null)
        {
            try
            {
                client.RefreshToken(state);
                return state; // Yes - we are done.
            }
            catch (DotNetOpenAuth.Messaging.ProtocolException ex)
            {

            }
        }

        // Retrieve the authorization from the user.
        state = AuthorizationMgr.RequestNativeAuthorization(client, scope);
        AuthorizationMgr.SetCachedRefreshToken(STORAGE, KEY, state);
        return state;
    }

具体的には、「リクエストの実行に失敗しました: https://docs.google.com/feeds/default/private/full/-/folder - リモート サーバーがエラーを返しました: (401) Unauthorized」というメッセージが表示されます。

私も試しました:

var docauth = new OAuth2Authenticator<NativeApplicationClient>(docprovider, GetDocAuthentication);
DocumentsService service1 = new DocumentsService("project");
service1.SetAuthenticationToken(docauth.State.AccessToken);

しかし、「状態」は常に null なので、null オブジェクト エラーが発生します。私は何を間違っていますか、これはどのように行われますか?

4

4 に答える 4

3

フォルダを一覧表示できる Documents List API ではなく、Drive SDKを使用する必要があります。ルート ディレクトリを一覧表示する場合は、「root」を folderId として使用できます。

于 2012-09-05T04:26:27.843 に答える
2

実際に GDrive SDK for .NET の v3 バージョンを実装し、フォルダーも検索する必要がありました。

私は、すべてのファイルを取得してから LinQ クエリを実行してフォルダーだけを保持するよりも、すべてのフォルダーを一意に要求することを好みます。

これは私の実装です:

private async Task<bool> FolderExistsAsync(string folderName)
{
    var response = await GetAllFoldersAsync();
    return response.Files
                   .Where(x => x.Name.ToLower() == folderName.ToLower())
                   .Any();
}

private async Task<Google.Apis.Drive.v3.Data.FileList> GetAllFoldersAsync()
{
    var request = _service.Files.List();
    request.Q = "mimeType = 'application/vnd.google-apps.folder'";
    var response = await request.ExecuteAsync();
    return response;
}

Qこの方法でも名前をリクエストできます。

request.Q = $"mimeType = 'application/vnd.google-apps.folder' and name = '{folderName}'";

これは、物事を次のように導き、簡素化します(nullチェックを不要にします):

private async Task<bool> FolderExistsAsync(string folderName)
{
    var response = await GetDesiredFolder(folderName);
    return response.Files.Any();
}

private async Task<FileList> GetDesiredFolder(string folderName)
{
    var request = _service.Files.List();
    request.Q = $"mimeType = 'application/vnd.google-apps.folder' and name = '{folderName}'";
    var response = await request.ExecuteAsync();
    return response;
}
于 2019-02-19T08:09:07.513 に答える
0
private IEnumerable<DocumentEntry> GetFolders(string id) {
    if (IsLogged) {
        var query = new FolderQuery(id)
        {
            ShowFolders = true
        };

        var feed = GoogleDocumentsService.Query(query);

        return feed.Entries.Cast<DocumentEntry>().Where(x => x.IsFolder).OrderBy(x => x.Title.Text);
    }

    return null;
}

    ...
var rootFolders = GetFolders("root");
if (rootFolders != null){
    foreach(var folder in rootFolders){
        var subFolders = GetFolders(folder.ResourceId);
        ...
    }
}

ここでGoogleDocumentsServiceは のインスタンスでDocumentsServiceあり、IsLoggedは成功ログ フラグです。

于 2014-10-28T10:25:48.633 に答える
0

Googleドライブからフォルダのリストを取得するには、この方法を使用しました

  FilesResource.ListRequest filelist= service.Files.List();
  filelist.Execute().Items.ToList().Where(x => x.MimeType == "application/vnd.google-apps.folder").ToList()
于 2014-12-04T11:48:05.463 に答える