0

私の会社のGoogleドライブフォルダにファイルをアップロードしようとしていますが、クライアントの介入なしにこれを達成することはできませんでした。だから、私が使用したときに、この:GoogleドライブAPI REST V2ファイルをフォルダファイルに挿入しない

package sample; 

import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; 
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
import com.google.api.client.http.FileContent; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.services.drive.Drive; 
import com.google.api.services.drive.DriveScopes; 
import com.google.api.services.drive.model.File; 
import com.google.api.services.drive.model.ParentReference; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Arrays; 

public class DriveCommandLine_srive 
{ 

    private static String CLIENT_ID = "myClientID.apps.googleusercontent.com"; 
    private static String CLIENT_SECRET = "myClientSecret"; 

    private static String REDIRECT_URI = "mything"; 

    public static void main(String[] args) throws IOException 
    { 
     HttpTransport httpTransport = new NetHttpTransport(); 
     JsonFactory jsonFactory = new JacksonFactory(); 

     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DriveScopes.DRIVE)).setAccessType("online").setApprovalPrompt("auto").build(); 

     System.out.println("xxxxx : " + DriveScopes.DRIVE); 

     String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build(); 
     System.out.println("Please open the following URL in your browser then type the authorization code:"); 
     System.out.println(" " + url); 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     String code = br.readLine(); 

     GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute(); 
     GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response); 

     // Create a new authorized API client 
     Drive service = new Drive.Builder(httpTransport, jsonFactory, credential).build(); 

     insertFile(service, "Test File Drive", "This is a test file","myCompanysFolderID" , "text/plain", "./data/document.txt"); 

     } 

    /** 
    * Insert new file. 
    * 
    * @param service Drive API service instance. 
    * @param title Title of the file to insert, including the extension. 
    * @param description Description of the file to insert. 
    * @param parentId Optional parent folder's ID. 
    * @param mimeType MIME type of the file to insert. 
    * @param filename Filename of the file to insert. 
    * @return Inserted file metadata if successful, {@code null} otherwise. 
    */ 
    private static File insertFile(Drive service, String title, String description, 
     String parentId, String mimeType, String filename) { 
     // File's metadata. 
     File body = new File(); 
     body.setTitle(title); 
     body.setDescription(description); 
     body.setMimeType(mimeType); 

     // Set the parent folder. 
     if (parentId != null && parentId.length() > 0) { 
     body.setParents(
      Arrays.asList(new ParentReference().setId(parentId))); 
     } 

     // File's content. 
     java.io.File fileContent = new java.io.File(filename); 
     FileContent mediaContent = new FileContent(mimeType, fileContent); 
     try { 
     File file = service.files().insert(body, mediaContent).execute(); 

     // Uncomment the following line to print the File ID. 
     System.out.println("File ID: " + file.getId()); 

     return file; 
     } catch (IOException e) { 
     System.out.println("An error occured: " + e); 
     return null; 
     } 
    } 

} 

私は成功し、同社のフォルダにファイルをアップロードするために管理し、私はそれを手動で承認すると、コードを毎回貼り付ける必要があります。ですから、私はこれを自動化したいので、認証 "メソッド"をサービスアカウントp12キーを使用してクライアントを承認するものに変更しました。これは、変更後の新しいコードです:

package sample; 

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse; 
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.http.javanet.NetHttpTransport; 
import com.google.api.client.json.JsonFactory; 
import com.google.api.client.json.jackson2.JacksonFactory; 
import com.google.api.client.util.store.FileDataStoreFactory; 
import com.google.api.services.drive.Drive; 
import com.google.api.services.drive.DriveScopes; 
import com.google.api.services.drive.model.File; 
import com.google.api.services.drive.model.ParentReference; 


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

public class DriveCommandLine2 
{ 

    private static final String KEY_FILE_LOCATION = "data/myp12Key.p12"; 
    **//Note: this is the mail from a service account in my dev console, it is different from the OAuth client I use in the previous method.** 
    private static final String SERVICE_ACCOUNT_EMAIL ="[email protected]"; 

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

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

    public static void main(String[] args) throws Exception 
    { 
     //Drive service = getServiceManual(); 
     Drive service = initializeDrive(); 
     //insertFile(service, "Test File Drive", "This is a test file","myCompanyFolderID" , "text/plain", "./data/document.txt"); 
     insertFile(service, "Test File Drive", "This is a test file","" , "text/plain", "./data/document.txt"); 
     } 

    /** 
    * Insert new file. 
    * 
    * @param service Drive API service instance. 
    * @param title Title of the file to insert, including the extension. 
    * @param description Description of the file to insert. 
    * @param parentId Optional parent folder's ID. 
    * @param mimeType MIME type of the file to insert. 
    * @param filename Filename of the file to insert. 
    * @return Inserted file metadata if successful, {@code null} otherwise. 
    */ 
    private static File insertFile(Drive service, String title, String description, 
     String parentId, String mimeType, String filename) { 
     // File's metadata. 
     File body = new File(); 
     body.setTitle(title); 
     body.setDescription(description); 
     body.setMimeType(mimeType); 

     // Set the parent folder. 
     if (parentId != null && parentId.length() > 0) { 
     body.setParents(
      Arrays.asList(new ParentReference().setId(parentId))); 
     } 

     // File's content. 
     java.io.File fileContent = new java.io.File(filename); 
     FileContent mediaContent = new FileContent(mimeType, fileContent); 
     try { 
     File file = service.files().insert(body, mediaContent).execute(); 

     // Uncomment the following line to print the File ID. 
     System.out.println("File ID: " + file.getId()); 

     return file; 
     } catch (IOException e) { 
     System.out.println("An error occured: " + e); 
     return null; 
     } 
    } 


    ///////////////////// 
    ///NEW GOOGLE ANALYTICS AUTH 

    public static java.io.File convIs2File(InputStream inputStream, java.io.File file) 
    { 
     java.io.OutputStream outputStream = null; 

     try { 
      // write the inputStream to a FileOutputStream 
      outputStream = new java.io.FileOutputStream(file); 

      int read = 0; 
      byte[] bytes = new byte[1024]; 

      while ((read = inputStream.read(bytes)) != -1) { 
       outputStream.write(bytes, 0, read); 
      } 

      System.out.println("Done!"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (inputStream != null) { 
       try { 
        inputStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (outputStream != null) { 
       try { 
        // outputStream.flush(); 
        outputStream.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      } 
     } 
     return file; 
    } 
    private static Drive initializeDrive() throws Exception { 
     // Initializes an authorized analytics service object. 

     // Construct a GoogleCredential object with the service account email 
     // and p12 file downloaded from the developer console. 
     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     InputStream is = DriveCommandLine2.class.getClassLoader().getResourceAsStream(KEY_FILE_LOCATION); 
     java.io.File f = java.io.File.createTempFile("myP12Key", ".p12"); 
     java.io.File f_used = convIs2File(is,f); 
     GoogleCredential credential = new GoogleCredential.Builder() 
       .setTransport(httpTransport) 
       .setJsonFactory(JSON_FACTORY) 
       .setServiceAccountId(SERVICE_ACCOUNT_EMAIL) 
       .setServiceAccountPrivateKeyFromP12File(f_used) 
       .setServiceAccountScopes(DriveScopes.all()) 
       .build(); 

     // Construct the Analytics service object. 
     return new Drive.Builder(httpTransport, JSON_FACTORY, credential) 
       .setApplicationName(APPLICATION_NAME).build(); 
    } 


} 

しかし、私はこのコードを実行すると、私は次のエラーを取得:

An error occured: com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found 
{ 
    "code" : 404, 
    "errors" : [ { 
    "domain" : "global", 
    "location" : "file", 
    "locationType" : "other", 
    "message" : "File not found: myCompanyFolderID", 
    "reason" : "notFound" 
    } ], 
    "message" : "File not found: myCompanyFolderID" 
} 

だから、私の推測では、以前の承認の方法で、私はということですが私のClient_IDとClient_Secretsを使用して自分のアプリケーションを私の会社のドライブスペースに挿入する権限を与えて、myCompanyFolderを見つけてファイルを正常に挿入できるようにしましたが、2番目の方法でファイルをサービスアカウントに挿入しようとしています私がアクセスできないドライブスペース(ドライブのルートに挿入しようとすると、それは完璧に機能するので、私はこれを知っていますしかし、私は自分のルートのファイルを見ることができません)。

最後に、私の質問は、ファイルを私の会社のドライブフォルダに手動で許可せずに挿入する方法ですか?つまり、私の会社のドライブに人間の介入なしにファイルをアップロードすることをアプリに許可するにはどうすればいいですか?

私は以前に試したようにclient_secretsの方法がうまくいかないと思うし、コードを初めて実行するときに手動で行うように求められます。私はLinuxサーバーのJARファイルから自分のコードを実行しているので、これは実用的ではなく、私のためには機能しません。

ありがとうございます!

答えて

0

404: File not foundは、ユーザーがファイルへの読み取りアクセス権を持っていないか、ファイルが存在しないことを意味します。

ファイルメタデータを要求するときに、正しいaccess_tokenを指定していることを確認してください。認証コードaccess_tokenを再生成してください。ユーザーに代わってauthorize and authenticateリクエストが必要な場合、キーとクライアントIDはユーザーのドキュメントにアクセスするのに十分ではありません。

ドキュメントは、ファイルへの読み取りアクセス権がないか、ファイルが存在しないことをユーザーに報告することを推奨しています。所有者にファイルの許可を求めるべきだと伝えてください。

関連する問題