1

我想通过使用 google drive PHP api 将 google drive 文件共享给其他 google 帐户用户的电子邮件 ID。有时文件正在与那个人共享,他可以在他的驱动器中查看/读取该文件,但有时我无法与他共享文件。我无法找到这种不一致的原因。如果文件未共享,则出现以下错误:

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\""
 }
}
4

2 回答 2

1

我自己的问题得到了答案,将文件上传到驱动器后,我们将获得 $file_google_id 并且我们必须使用 sleep(10) 等待 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;
    }

谢谢

于 2018-12-18T06:23:20.220 回答
0

如果您尝试上传文件并同时与另一个帐户共享,则需要等待几秒钟才能执行权限请求。我可以像这样在我的 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
}
于 2018-12-16T18:16:08.590 回答