使用API​​和错误403将文件上传到Google驱动器 [英] Upload the file to Google drive using API and error 403

查看:48
本文介绍了使用API​​和错误403将文件上传到Google驱动器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将zip文件上传到Google驱动器.我使用Java快速入门( https://developers.google.com/drive/v3/web/quickstart/java )作为基础.该代码有效.我通过以下代码对其进行了修改

I want to upload the zip-file to Google drive. I use Java Quickstart (https://developers.google.com/drive/v3/web/quickstart/java) as base. The code works. I modified it by the following code

File fileMetadata = new File();
fileMetadata.setName("My Report");
fileMetadata.setMimeType("application/vnd.google-apps.spreadsheet");

java.io.File filePath = new java.io.File("files/report.csv");
FileContent mediaContent = new FileContent("text/csv", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
.setFields("id")
.execute();
System.out.println("File ID: " + file.getId());

现在我的编译器显示错误403.

Now my compiler shows the error 403.

c:\wd2>gradle -q run
юъЄ 23, 2016 8:02:06 PM com.google.api.client.util.store.FileDataStoreFactory se
tPermissionsToOwnerOnly
WARNING: unable to change permissions for everybody: C:\Users\Home\.credentials\
drive-java-quickstart
юъЄ 23, 2016 8:02:06 PM com.google.api.client.util.store.FileDataStoreFactory se
tPermissionsToOwnerOnly
WARNING: unable to change permissions for owner: C:\Users\Home\.credentials\driv
e-java-quickstart
Credentials saved to C:\Users\Home\.credentials\drive-java-quickstart
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonRespo
nseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Insufficient Permission",
    "reason" : "insufficientPermissions"
  } ],
  "message" : "Insufficient Permission"
}
        at com.google.api.client.googleapis.json.GoogleJsonResponseException.fro
m(GoogleJsonResponseException.java:146)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie
ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClie
ntRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.executeUnparsed(AbstractGoogleClientRequest.java:432)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.executeUnparsed(AbstractGoogleClientRequest.java:352)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest
.execute(AbstractGoogleClientRequest.java:469)
        at DriveQuickstart.main(DriveQuickstart.java:126)

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':run'.
> Process 'command 'C:\Program Files\Java\jdk1.8.0_101\bin\java.exe'' finished w
ith non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug
option to get more log output.

我该如何解决?

源代码:

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;

import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.*;
import com.google.api.services.drive.Drive;


import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class DriveQuickstart {
    /** Application name. */
    private static final String APPLICATION_NAME =
        "Drive API Java Quickstart";

    /** Directory to store user credentials for this application. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/drive-java-quickstart");

    /** Global instance of the {@link FileDataStoreFactory}. */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY =
        JacksonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport HTTP_TRANSPORT;

    /** Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/drive-java-quickstart
     */
    private static final List<String> SCOPES =
        Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY);

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
            DriveQuickstart.class.getResourceAsStream("/client_secret.json");
        GoogleClientSecrets clientSecrets =
            GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow =
                new GoogleAuthorizationCodeFlow.Builder(
                        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(DATA_STORE_FACTORY)
                .setAccessType("offline")
                .build();
        Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Drive client service.
     * @return an authorized Drive client service
     * @throws IOException
     */
    public static Drive getDriveService() throws IOException {
        Credential credential = authorize();
        return new Drive.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void main(String[] args) throws IOException {
        // Build a new authorized API client service.
        Drive service = getDriveService();

        // Print the names and IDs for up to 10 files.
        FileList result = service.files().list()
             .setPageSize(10)
             .setFields("nextPageToken, files(id, name)")
             .execute();

        //*
        File fileMetadata = new File();
        fileMetadata.setName("My Report");
        fileMetadata.setMimeType("application/zip");

        java.io.File filePath = new java.io.File("c:\\profiles.zip");
        FileContent mediaContent = new FileContent("application/zip", filePath);
        File file = service.files().create(fileMetadata, mediaContent)
        .setFields("id")
        .execute();
        System.out.println("File ID: " + file.getId()); //*/
    }

}

推荐答案

我还建议从Arrays.asList(DriveScopes. DRIVE_METADATA_READONLY )更改 SCOPE .到Arrays.asList(DriveScopes. DRIVE );

I would also recommend changing the SCOPE from Arrays.asList(DriveScopes.DRIVE_METADATA_READONLY); to Arrays.asList(DriveScopes.DRIVE);

以下是有关

Here is more documentation on Google Drive API SCOPES.

  1. 更改SCOPE时,请记住删除存储在项目的 tokens 文件夹中的" StoredCredential "文件.

  1. When changing the SCOPE remember to delete your "StoredCredential" file that is stored within the tokens folder of your project.

再次运行程序,以便提示提示您提供Google登录凭据 允许 >您的程序以组织,添加和编辑在Google云端硬盘上的文件.

Run your program again so that you will be prompted to provide Google login credentials to allow your program to organize, add and edit files on Google Drive.

在身份验证过程中授予权限时,请确保允许程序在Google云端硬盘上组织,添加和编辑文件.

Ensure that you allow your program to organize, add and edit files on Google Drive when granting permission in the authentication process.

身份验证过程生成一个新的" StoredCredential "文件,将包含您的<您指定的strong>新范围.

The authentication process will generate a new "StoredCredential" file that will include your new SCOPE which you have specified.

这对我有用,希望它也对您有用.

This worked for me hope it will work for you as well.

这篇关于使用API​​和错误403将文件上传到Google驱动器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆