Google Drive API для обмена файлами с другими пользователями аккаунта Google

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

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

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("[email protected]")
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
}
0

Другие решения

У меня есть ответ на мой собственный вопрос, после загрузки файла на диск мы получим $ 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

По вопросам рекламы [email protected]