Google диск API для обмена файлами с другим пользователем учетной записи Google - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу поделиться файлами на диске Google с другим идентификатором электронной почты пользователя учетной записи Google, используя API-интерфейс PHP на Google Диске.Иногда файл делится с этим человеком, и он может просматривать / читать этот файл на своем диске, но иногда я не могу поделиться им с ним.Я не могу найти причину этого несоответствия.Если файл не передается, я получаю следующую ошибку:

An error occurred: {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "internalError",
    "message": "Internal Error. User message: \"An internal error has occurred which prevented the sharing of these item(s): 1544784669.1.junkfile.pdf\""
   }
  ],
  "code": 500,
  "message": "Internal Error. User message: \"An internal error has occurred which prevented the sharing of these item(s): 1544784669.1.junkfile.pdf\""
 }
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

У меня есть ответ на мой собственный вопрос, после загрузки файла на диск мы получим $ file_google_id и нам придется ждать 10 секунд, используя sleep (10), тогда только мы можем поделиться этим файлом с кем угодно.

 sleep(10);
    $permission=insertPermission($service,$file_google_id,$email_id,'user','reader');
    function insertPermission($service,$fileId,$value,$type,$role) {

        $newPermission = new Google_Service_Drive_Permission();

        $newPermission->setEmailAddress($value); 
        $newPermission->setType($type);
        $newPermission->setRole($role);

        try {
            return $service->permissions->create($fileId, $newPermission);

        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
        }
        return NULL;
    }

Спасибо

0 голосов
/ 16 декабря 2018

Если вы пытаетесь одновременно загрузить файл и поделиться им с другой учетной записью, вам нужно подождать несколько секунд, прежде чем выполнять запрос разрешений.Я мог бы добиться этого в своем приложении для Android, например, (используя Kotlin и RxJava):

private fun uploadFile(accessToken: String, fileName: String, fileContent: String) {
  Observable.just(Unit)
    .subscribeOn(Schedulers.io())
    .subscribe({
      val httpTransport = NetHttpTransport()
      val credential = Credential.Builder(BearerToken.authorizationHeaderAccessMethod())
          .build()
      credential.accessToken = accessToken
      val service = Drive.Builder(httpTransport, JacksonFactory.getDefaultInstance(),
          credential)
          .setApplicationName("Your App Name")
          .build()
      val fileMetadata = File()
      fileMetadata.name = fileName
      val localFile = createFile(fileName, fileContent)
      val mediaContent = InputStreamContent("text/plain", localFile);
      val file = service.files().create(fileMetadata, mediaContent)
          .setFields("id")
          .execute()
      Log.d(TAG, "File ID: " + file.id)

      Observable.interval(10, TimeUnit.SECONDS)
          .take(1)
          .subscribe {
            val callback = object : JsonBatchCallback<Permission>() {

              @Throws(IOException::class)
              override fun onFailure(e: GoogleJsonError, responseHeaders: HttpHeaders) {
                Log.d(TAG, "error: ${e.message}")
              }

              @Throws(IOException::class)
              override fun onSuccess(permission: Permission, responseHeaders: HttpHeaders) {
                Log.d(TAG, "Permission ID: ${permission.id}")
              }
            }
            val batch = service.batch()
            val userPermission = Permission()
                .setType("user")
                .setRole("writer")
                .setEmailAddress("account_you_want_to_share_with@email.com")
            service.permissions().create(file.id, userPermission)
                .setFields("id")
                .queue(batch, callback)
            batch.execute()
          }
    }) {
      Log.d(TAG, "error: ", it)
    }
  }

private fun createFile(fileName: String, fileContent: String): InputStream? {
  try {
    val outputStreamWriter = OutputStreamWriter(
        application.openFileOutput(fileName, Context.MODE_PRIVATE))
    outputStreamWriter.write(fileContent)
    outputStreamWriter.close()
    return application.openFileInput(fileName)
  } catch (e: IOException) {
    Log.e(TAG, "File write failed: ", e)
  }
  return null
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...