0

GoogleドライブAPIを使用してファイルをアップロードする際に問題が発生しています。 APIはエラーを返さず、ファイルが正常にアップロードされたかのように表示されます。ただし、ファイルのリストを取得しようとすると、GoogleドライブAPIページを表示しようとしても表示されません。GoogleドライブAPIを使用するとアップロードされたファイルが表示されません

はここにいくつかの観測です:

  • パスは、Java上か存在していたかどうか、私はすでに確認されたのだが、存在しません。
  • ファイルが正常にアップロードされます。IDを返し、進行速度は1.0であり、メッセージエラーはありません。
  • 私が使用しているスコープは、ドライブのグローバルスコープであり、ファイルスコープではありません。 "https://www.googleapis.com/auth/drive"
  • Googleのコンソール開発者ページにクエリが正常に表示されます。
  • 私はすでにフォルダを作成する代わりに、rootとしてフォルダを作成しようとしました。ここで
  • このプロジェクトで使用されるAPIのバージョンが「V3-rev90-1.23.0」である

は(私はJava断片に基づいて、それを作成しようとした)どのように私のコードのルックスです。

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); 
} 

} 

このコードの結果は次のとおり
フォルダID: "フォルダIDの文字列"
1.0
ファイルID: "ファイルIDの文字列"
{}
({ }はドライブに存在するすべてのファイルである必要があります)

ドライブに表示されない理由は何ですか?

+0

createFileには、実際に作成されたファイルIDを含むファイルリソースが含まれている必要があります。アプリケーションを認証した同じユーザーのGoogleドライブアカウントを確認してもよろしいですか?あなたは現在どのファイルがGoogleドライブにあるかを確認するためにfiles.listを実行できます。少なくとも同じユーザーで認証されていることを確認できます。 – DaImTo

+0

はい、createFileには作成されたファイルのfileIdが含まれます。そして、それは "System.out.println(" File ID: "+ file.getId());"に印刷されます。 " はい、私は正しいアカウントをチェックしていると確信しています。私はそれをダブルチェックしました。 –

+1

あなたは認証のためにサービスアカウントを使用していますか? – DaImTo

答えて

1

サービスアカウントを使用して認証されているようです。あなたはサービスアカウントがあなたではないことを覚えておく必要があります。ダミーユーザーとは、自分のGoogleドライブアカウントを持っていると思います。ファイルをGoogleドライブアカウントのサービスアカウントにアップロードしています。これらのアップロードされたファイルを表示するには、files.listを実行します。サービスアカウントのWebインターフェイスビューはありません。

サービスアカウントのメールアドレスを取得し、個人用のGoogleドライブアカウントのディレクトリを共有すると、このディレクトリにアップロードするサービスアカウントの権限が付与されます。サービスアカウントにファイルにパッチを適用させて、ユーザーにファイルへのアクセスを許可するか、アクセス許可を与えないようにする必要があります。

+0

ああ私はそれを得た!それは理にかなっている=)。 System.out.println(service.files()。list())を使用してサーバーからファイルリストを取得しようとすると、まだファイルが取得されません。 –

+0

これは奇妙に思えるが、私のJavaはちょっとラスティですが、私はあなたのコードをテストする時間を見つけることができます。しかし、TBHは正しく見える – DaImTo

+0

私は自分のコードを見ていたので、リストを取得するには、リストが返された後に "実行"しなければならないことに気付きました。 ファイルリストを取得する場合は、次のコマンドを使用する必要があります。 \t FileList l = service.files()。list()。execute(); それはドライバに表示されていないので、あなたはこの1つになりました。それは実際にはサービスメールであるためです。あなたのすべての助けをありがとう=)。 –

関連する問題