0

Ich habe Probleme beim Hochladen meiner Dateien mit Google Drive API. Die API gibt keinen Fehler zurück und zeigt an, als ob die Datei erfolgreich hochgeladen wurde. Wenn ich jedoch versuche, eine Liste der Dateien abzurufen, wird sie nicht angezeigt und erscheint auch nicht, wenn ich versuche, die Google Drive-API-Seite aufzurufen.Die hochgeladene Datei wird nicht angezeigt, wenn Google Drive API verwendet wird

Hier sind einige Beobachtungen:

  • ich bereits überprüft haben, ob der Pfad auf Java existiert oder nicht, und es existiert nicht.
  • Die Datei wurde erfolgreich hochgeladen, da sie eine ID zurückgibt, die Fortschrittsrate bei 1,0 liegt und kein Nachrichtenfehler vorliegt.
  • Das SCOPE, das ich verwende, ist der globale Bereich des Laufwerks und nicht der Dateibereich. "https://www.googleapis.com/auth/drive"
  • Die Abfrage wird erfolgreich auf der Konsolenentwicklerseite von Google angezeigt.
  • Ich habe bereits versucht, es mit root als Ordner zu erstellen, anstatt einen Ordner zu erstellen.
  • Die Version auf diesem Projekt des Api ist „v3-rev90-1.23.0“

Hier ist, wie mein Code aussieht (ich habe versucht, es basiert auf dem Java-Snippet zu erstellen).

public class Quickstart { 
/** Application name. */ 
private static final String APPLICATION_NAME = "Drive API Java Quickstart"; 
/** Directory to store user credentials for this application. */ 

/** 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); 

static { 
    try { 
     HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); 
    } 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 { 
    GoogleCredential credential = GoogleCredential.fromStream(Quickstart.class.getResourceAsStream("/secret.json")); 
    credential = credential.createScoped(SCOPES); 
    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 String generateFolder(Drive service) throws IOException { 
    File fileMetadata = new File(); 
    fileMetadata.setName("Invoices"); 
    fileMetadata.setMimeType("application/vnd.google-apps.folder"); 

    File file = service.files().create(fileMetadata).setFields("id").execute(); 
    System.out.println("Folder ID: " + file.getId()); 
    return file.getId(); 
} 

public static void uploadFile(Create createFile, Drive service) throws IOException, InterruptedException { 
    File file = createFile.execute(); 
    Thread.sleep(3000); 
    MediaHttpUploader uploader = createFile.getMediaHttpUploader(); 
    System.out.println(uploader.getProgress()); 
    System.out.println("File ID: " + file.getId()); 
    System.out.println(service.files().list()); 
} 

public static Create createFile(String path, Drive service) throws IOException { 
    String folderId = generateFolder(service); 
    File fileMetadata = new File(); 
    fileMetadata.setName("photo.jpg"); 
    fileMetadata.setParents(Collections.singletonList(folderId)); 
    java.io.File filePath = new java.io.File(path); 
    FileContent mediaContent = new FileContent("image/jpeg", filePath); 
    Create createFile = service.files().create(fileMetadata, mediaContent).setFields("id, parents"); 
    return createFile; 
} 

public static void main(String[] args) throws IOException, InterruptedException { 
    Drive service = getDriveService(); 
    String path = "F:/workspace/drive/files/photo.jpg"; 
    Create createdFile = createFile(path, service); 
    uploadFile(createdFile, service); 
} 

} 

Das Ergebnis dieses Codes ist:
ID Folder: "String des Ordners ID"
1.0
Datei-ID: "String der Datei-ID"
{}
(wobei { } sollten alle Dateien auf dem Laufwerk vorhanden sein)

Jeder hat eine Idee, warum es nicht auf der Festplatte erscheint?

+0

createFile sollte die Dateiressource enthalten, die eine Datei-ID enthalten sollte, wenn sie tatsächlich erstellt wurde. Sind Sie sicher, dass Sie das Google Drive-Konto des Benutzers überprüfen, mit dem Sie Ihre Anwendung authentifiziert haben? Sie können eine files.list machen, um zu überprüfen, welche Dateien sich gerade auf Google Drive befinden, dann können Sie zumindest sicher sein, dass Sie sich mit demselben Benutzer authentifizieren. – DaImTo

+0

Ja, createFile enthält die Datei-ID der erstellten Datei. Und es gibt es gedruckt auf "System.out.println (" File ID: "+ file.getId());". Und ja, ich bin mir sicher, dass ich das richtige Konto einchecke, ich habe es doppelt überprüft. –

+1

Gibt es eine Chance, dass Sie ein Dienstkonto für die Authentifizierung verwenden? – DaImTo

Antwort

1

Sie scheinen sich mit einem Dienstkonto zu authentifizieren. Sie müssen daran denken, dass ein Dienstkonto Sie nicht ist, denken Sie daran, dass es sich um einen Dummy-Benutzer handelt, der ein eigenes Google Drive-Konto besitzt. Sie haben Dateien auf das Google Drive-Konto des Dienstkontos hochgeladen. Sie können eine files.list erstellen, um diese hochgeladenen Dateien anzuzeigen. Es gibt keine Web-Interface-Ansicht für ein Dienstkonto.

Sie können die E-Mail-Adresse des Dienstkontos verwenden und ein Verzeichnis auf Ihrem persönlichen Google Drive-Konto teilen. Dies gibt dem Dienstkonto Berechtigungen zum Hochladen in dieses Verzeichnis. Sie müssen daran denken, dass das Dienstkonto die Dateien patcht, um Ihrem Benutzer Zugriff auf die Dateien zu gewähren, oder Sie haben keine Berechtigungen für sie.

+0

Oh ich habe es! Das macht Sinn =). Obwohl ich immer noch keine Dateien bekomme, wenn ich versuche, eine Dateiliste vom Server mit System.out.println (service.files(). List()) zu bekommen; –

+0

das scheint seltsam, aber mein Java ist ein bisschen Rusty Ich werde sehen, ob ich etwas Zeit finden, um Ihren Code zu testen.aber TBH es sieht richtig aus – DaImTo

+0

So schaute ich auf meinen Code und ich erkannte, dass man die Liste "execute" setzen sollte, nachdem die Liste zurückgegeben wurde, andernfalls würde es als leer zurückgegeben werden. Wenn also die Dateiliste abgerufen werden soll, sollte der folgende Befehl verwendet werden: \t FileList l = service.files(). List(). Execute(); Da es nicht auf dem Treiber angezeigt wird, warst du direkt auf diesem. Es ist in der Tat, weil es eine Service-Mail ist. Vielen Dank noch einmal für Ihre Hilfe =). –

Verwandte Themen