[英]Upload the file to Google drive using API and error 403
I want to upload the zip-file to Google drive.我想将 zip 文件上传到 Google 驱动器。 I use Java Quickstart ( https://developers.google.com/drive/v3/web/quickstart/java ) as base.
我使用 Java Quickstart ( https://developers.google.com/drive/v3/web/quickstart/java ) 作为基础。 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());
Now my compiler shows the error 403.现在我的编译器显示错误 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.
How can I fix it?我该如何解决?
The source code:源代码:
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()); //*/
}
}
I would also recommend changing the SCOPE from Arrays.asList(DriveScopes. DRIVE_METADATA_READONLY );我还建议从 Arrays.asList(DriveScopes. DRIVE_METADATA_READONLY ); 更改范围。 to Arrays.asList(DriveScopes. DRIVE );
到Arrays.asList(DriveScopes DRIVE);
Here is more documentation on Google Drive API SCOPES .这里有更多关于Google Drive API SCOPE 的文档。
When changing the SCOPE remember to delete your " StoredCredential " file that is stored within the tokens folder of your project.更改 SCOPE 时,请记住删除存储在项目的tokens文件夹中的“ StoredCredential ”文件。
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 登录凭据,以允许您的程序组织、添加和编辑Google Drive 上的文件。
Ensure that you allow your program to organize, add and edit files on Google Drive when granting permission in the authentication process.在身份验证过程中授予权限时,请确保您允许您的程序组织、添加和编辑Google Drive 上的文件。
The authentication process will generate a new " StoredCredential " file that will include your new SCOPE which you have specified.身份验证过程将生成一个新的“ StoredCredential ”文件,其中将包含您指定的新 SCOPE 。
This worked for me hope it will work for you as well.这对我有用,希望它也对你有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.