Я пытаюсь загрузить изображение на Google Диск для оптического распознавания символов (OCR). Вот мои коды:
require_once('vendor/autoload.php');
// Initialize Google Client
$client_email = '[email protected]';
$private_key = file_get_contents('key.p12');
$scopes = array(
'https://www.googleapis.com/auth/drive.file'
);
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
// Initialize Google Drive service
$service = new Google_Service_Drive($client);
// Upload File
$file = new Google_Service_Drive_DriveFile();
$file->setName('Test Image for OCR');
$file->setDescription('Test Image for OCR');
$file->setMimeType('image/jpeg');
try {
$data = file_get_contents($filename);
$createdFile = $service->files->create($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
));
var_dump($createdFile);
// ===========
// So, what's next?
// ===========
} catch(Exception $e) {
echo 'Error occurred: ' . $e->getMessage();
}
Приведенные выше коды работают без ошибок, а $createdFile
является действительным ресурсом в Google_Service_Drive_DriveFile
форма объекта.
Вопросы:
Я думаю, загрузка прошла успешно, так как create()
функция не возвращает ошибку. Однако я не вижу загруженных файлов на моем Google Диске. Разве он не должен быть загружен в корневую папку Google Диска?
Как я могу выполнить OCR? Я могу читать с Вот что есть параметр с именем ocrLanguage
, Где мне это поставить и как получить результат?
Заранее спасибо.
ОБНОВИТЬ var_dump()
результаты следующие:
object(Google_Service_Drive_DriveFile)#18 (55) {
["collection_key":protected]=>
string(6) "spaces"["internal_gapi_mappings":protected]=>
array(0) {
}
["appProperties"]=>
NULL
["capabilitiesType":protected]=>
string(42) "Google_Service_Drive_DriveFileCapabilities"["capabilitiesDataType":protected]=>
string(0) ""["contentHintsType":protected]=>
string(42) "Google_Service_Drive_DriveFileContentHints"["contentHintsDataType":protected]=>
string(0) ""["createdTime"]=>
NULL
["description"]=>
NULL
["explicitlyTrashed"]=>
NULL
["fileExtension"]=>
NULL
["folderColorRgb"]=>
NULL
["fullFileExtension"]=>
NULL
["headRevisionId"]=>
NULL
["iconLink"]=>
NULL
["id"]=>
string(28) "0B_XXXXX1yjq7dENaQWp4ckZoRk0"["imageMediaMetadataType":protected]=>
string(48) "Google_Service_Drive_DriveFileImageMediaMetadata"["imageMediaMetadataDataType":protected]=>
string(0) ""["kind"]=>
string(10) "drive#file"["lastModifyingUserType":protected]=>
string(25) "Google_Service_Drive_User"["lastModifyingUserDataType":protected]=>
string(0) ""["md5Checksum"]=>
NULL
["mimeType"]=>
string(10) "image/jpeg"["modifiedByMeTime"]=>
NULL
["modifiedTime"]=>
NULL
["name"]=>
string(18) "Test Image for OCR"["originalFilename"]=>
NULL
["ownedByMe"]=>
NULL
["ownersType":protected]=>
string(25) "Google_Service_Drive_User"["ownersDataType":protected]=>
string(5) "array"["parents"]=>
NULL
["permissionsType":protected]=>
string(31) "Google_Service_Drive_Permission"["permissionsDataType":protected]=>
string(5) "array"["properties"]=>
NULL
["quotaBytesUsed"]=>
NULL
["shared"]=>
NULL
["sharedWithMeTime"]=>
NULL
["sharingUserType":protected]=>
string(25) "Google_Service_Drive_User"["sharingUserDataType":protected]=>
string(0) ""["size"]=>
NULL
["spaces"]=>
NULL
["starred"]=>
NULL
["thumbnailLink"]=>
NULL
["trashed"]=>
NULL
["version"]=>
NULL
["videoMediaMetadataType":protected]=>
string(48) "Google_Service_Drive_DriveFileVideoMediaMetadata"["videoMediaMetadataDataType":protected]=>
string(0) ""["viewedByMe"]=>
NULL
["viewedByMeTime"]=>
NULL
["viewersCanCopyContent"]=>
NULL
["webContentLink"]=>
NULL
["webViewLink"]=>
NULL
["writersCanShare"]=>
NULL
["modelData":protected]=>
array(0) {
}
["processed":protected]=>
array(0) {
}
}
Файл можно получить через $service->files->get($file_id);
, но он невидим в моем Google Диске. Возвращенный объект File Resource также не содержит ничего полезного.
Сервисная учетная запись — это не вы, скорее, фиктивный пользователь. У него есть собственный аккаунт на диске.
Если вы хотите загрузить в личный кабинет. Возьмите адрес электронной почты учетной записи службы и предоставьте ему каталог в своей личной учетной записи диска. Так же, как и любой другой пользователь, с которым вы хотели бы поделиться каталогом или файлом.
Затем вам нужно выяснить идентификатор каталога только так, как я нашел, чтобы служебная учетная запись выполняла файл files.list, чтобы получить список всего, к чему он теперь имеет доступ. Как только вы найдете идентификатор каталога или родительский идентификатор
Вы можете изменить свой код выше на что-то вроде
'data' => $data,
'mimeType' => 'image/jpeg',
'parents' => 'the directory id'
Я думаю, судя по вашему коду, вы используете API V3, у меня не было времени поиграть с ним. 'parents' => 'the directory id'
<- это обоснованное предположение. Если это не сработает, дайте мне знать, и я немного поищу в Google, чтобы выяснить, как передать parent в v3.
Вариант № 2:
Другим вариантом будет предоставление учетной записи службы доступа к своей папке, после чего у вас будет доступ к ее учетной записи диска, и вы сможете увидеть эту папку в своей веб-версии диска. Снова ищите разрешения. Я думаю, что вы используете V3. Я еще не смотрел его. Разница в том, где хранятся данные и кому подсчитывается хранилище.
Я только что нашел способ распознавания текста в V3.
Постскриптум Похоже, шаг 2 не будет работать с «appDataFolder».
UserCredential credential = null;
try
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new Uri("ms-appx:///Assets/client_secret.json"),
new[] { DriveService.Scope.DriveFile }, "user", CancellationToken.None);
}
catch (AggregateException ex)
{
Debug.Write("Credential failed, " + ex.Message);
}
// Create Drive API service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "TestApp",
});
// Create folder
var folderMetadata = new Google.Apis.Drive.v3.Data.File();
folderMetadata.Name = "NewFolder";
folderMetadata.MimeType = "application/vnd.google-apps.folder";
var request = service.Files.Create(folderMetadata);
request.Fields = "id";
var folder = request.Execute();
Debug.WriteLine("Folder ID: " + folder.Id);
// Upload the image file
var fileMetadata = new Google.Apis.Drive.v3.Data.File();
fileMetadata.Name = inputFile.Name;
fileMetadata.Parents = new List<string> { folder.Id };
FilesResource.CreateMediaUpload requestUpload;
using (var stream = new System.IO.FileStream(inputFile.Path, System.IO.FileMode.Open))
{
requestUpload = service.Files.Create(fileMetadata, stream, "image/jpeg");
requestUpload.Fields = "id";
requestUpload.Upload();
}
var imgFile = requestUpload.ResponseBody;
Debug.WriteLine("File ID: " + imgFile.Id);
// Copy image and paste as document
var textMetadata = new Google.Apis.Drive.v3.Data.File();
textMetadata.Name = inputFile.Name;
textMetadata.Parents = new List<string> { folderId };
textMetadata.MimeType = "application/vnd.google-apps.document";
FilesResource.CopyRequest requestCopy = service.Files.Copy(textMetadata, imgFile.Id);
requestCopy.Fields = "id";
requestCopy.OcrLanguage = "zh";
var textFile = requestCopy.Execute();
// Now we export document as plain text
FilesResource.ExportRequest requestExport = service.Files.Export(textFile.Id, "text/plain");
string output = requestExport.Execute();
Не используйте служебную учетную запись. Если вы хотите загрузить свою учетную запись, вам просто нужно получить соответствующий токен доступа для своей учетной записи. Использование промежуточной учетной записи с использованием общих папок действительно ужасно (imho).
Я пытаюсь загрузить изображение на Google Диск для оптического распознавания символов (OCR). Вот мои коды:
require_once('vendor/autoload.php');
// Initialize Google Client
$client_email = '[email protected]';
$private_key = file_get_contents('key.p12');
$scopes = array(
'https://www.googleapis.com/auth/drive.file'
);
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key
);
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
// Initialize Google Drive service
$service = new Google_Service_Drive($client);
// Upload File
$file = new Google_Service_Drive_DriveFile();
$file->setName('Test Image for OCR');
$file->setDescription('Test Image for OCR');
$file->setMimeType('image/jpeg');
try {
$data = file_get_contents($filename);
$createdFile = $service->files->create($file, array(
'data' => $data,
'mimeType' => 'image/jpeg',
));
var_dump($createdFile);
// ===========
// So, what's next?
// ===========
} catch(Exception $e) {
echo 'Error occurred: ' . $e->getMessage();
}
Приведенные выше коды работают без ошибок, а $createdFile
является действительным ресурсом в Google_Service_Drive_DriveFile
форма объекта.
Вопросы:
Я думаю, загрузка прошла успешно, так как create()
функция не возвращает ошибку. Однако я не вижу загруженных файлов на моем Google Диске. Разве он не должен быть загружен в корневую папку Google Диска?
Как я могу выполнить OCR? Я могу читать с Вот что есть параметр с именем ocrLanguage
, Где мне это поставить и как получить результат?
Заранее спасибо.
ОБНОВИТЬ var_dump()
результаты следующие:
object(Google_Service_Drive_DriveFile)#18 (55) {
["collection_key":protected]=>
string(6) "spaces"["internal_gapi_mappings":protected]=>
array(0) {
}
["appProperties"]=>
NULL
["capabilitiesType":protected]=>
string(42) "Google_Service_Drive_DriveFileCapabilities"["capabilitiesDataType":protected]=>
string(0) ""["contentHintsType":protected]=>
string(42) "Google_Service_Drive_DriveFileContentHints"["contentHintsDataType":protected]=>
string(0) ""["createdTime"]=>
NULL
["description"]=>
NULL
["explicitlyTrashed"]=>
NULL
["fileExtension"]=>
NULL
["folderColorRgb"]=>
NULL
["fullFileExtension"]=>
NULL
["headRevisionId"]=>
NULL
["iconLink"]=>
NULL
["id"]=>
string(28) "0B_XXXXX1yjq7dENaQWp4ckZoRk0"["imageMediaMetadataType":protected]=>
string(48) "Google_Service_Drive_DriveFileImageMediaMetadata"["imageMediaMetadataDataType":protected]=>
string(0) ""["kind"]=>
string(10) "drive#file"["lastModifyingUserType":protected]=>
string(25) "Google_Service_Drive_User"["lastModifyingUserDataType":protected]=>
string(0) ""["md5Checksum"]=>
NULL
["mimeType"]=>
string(10) "image/jpeg"["modifiedByMeTime"]=>
NULL
["modifiedTime"]=>
NULL
["name"]=>
string(18) "Test Image for OCR"["originalFilename"]=>
NULL
["ownedByMe"]=>
NULL
["ownersType":protected]=>
string(25) "Google_Service_Drive_User"["ownersDataType":protected]=>
string(5) "array"["parents"]=>
NULL
["permissionsType":protected]=>
string(31) "Google_Service_Drive_Permission"["permissionsDataType":protected]=>
string(5) "array"["properties"]=>
NULL
["quotaBytesUsed"]=>
NULL
["shared"]=>
NULL
["sharedWithMeTime"]=>
NULL
["sharingUserType":protected]=>
string(25) "Google_Service_Drive_User"["sharingUserDataType":protected]=>
string(0) ""["size"]=>
NULL
["spaces"]=>
NULL
["starred"]=>
NULL
["thumbnailLink"]=>
NULL
["trashed"]=>
NULL
["version"]=>
NULL
["videoMediaMetadataType":protected]=>
string(48) "Google_Service_Drive_DriveFileVideoMediaMetadata"["videoMediaMetadataDataType":protected]=>
string(0) ""["viewedByMe"]=>
NULL
["viewedByMeTime"]=>
NULL
["viewersCanCopyContent"]=>
NULL
["webContentLink"]=>
NULL
["webViewLink"]=>
NULL
["writersCanShare"]=>
NULL
["modelData":protected]=>
array(0) {
}
["processed":protected]=>
array(0) {
}
}
Файл можно получить через $service->files->get($file_id);
, но он невидим в моем Google Диске. Возвращенный объект File Resource также не содержит ничего полезного.
Сервисная учетная запись — это не вы, скорее, фиктивный пользователь. У него есть собственный аккаунт на диске.
Если вы хотите загрузить в личный кабинет. Возьмите адрес электронной почты учетной записи службы и предоставьте ему каталог в своей личной учетной записи диска. Так же, как и любой другой пользователь, с которым вы хотели бы поделиться каталогом или файлом.
Затем вам нужно выяснить идентификатор каталога только так, как я нашел, чтобы служебная учетная запись выполняла файл files.list, чтобы получить список всего, к чему он теперь имеет доступ. Как только вы найдете идентификатор каталога или родительский идентификатор
Вы можете изменить свой код выше на что-то вроде
'data' => $data,
'mimeType' => 'image/jpeg',
'parents' => 'the directory id'
Я думаю, судя по вашему коду, вы используете API V3, у меня не было времени поиграть с ним. 'parents' => 'the directory id'
<- это обоснованное предположение. Если это не сработает, дайте мне знать, и я немного поищу в Google, чтобы выяснить, как передать parent в v3.
Вариант № 2:
Другим вариантом будет предоставление учетной записи службы доступа к своей папке, после чего у вас будет доступ к ее учетной записи диска, и вы сможете увидеть эту папку в своей веб-версии диска. Снова ищите разрешения. Я думаю, что вы используете V3. Я еще не смотрел его. Разница в том, где хранятся данные и кому подсчитывается хранилище.
Я только что нашел способ распознавания текста в V3.
Постскриптум Похоже, шаг 2 не будет работать с «appDataFolder».
UserCredential credential = null;
try
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new Uri("ms-appx:///Assets/client_secret.json"),
new[] { DriveService.Scope.DriveFile }, "user", CancellationToken.None);
}
catch (AggregateException ex)
{
Debug.Write("Credential failed, " + ex.Message);
}
// Create Drive API service.
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "TestApp",
});
// Create folder
var folderMetadata = new Google.Apis.Drive.v3.Data.File();
folderMetadata.Name = "NewFolder";
folderMetadata.MimeType = "application/vnd.google-apps.folder";
var request = service.Files.Create(folderMetadata);
request.Fields = "id";
var folder = request.Execute();
Debug.WriteLine("Folder ID: " + folder.Id);
// Upload the image file
var fileMetadata = new Google.Apis.Drive.v3.Data.File();
fileMetadata.Name = inputFile.Name;
fileMetadata.Parents = new List<string> { folder.Id };
FilesResource.CreateMediaUpload requestUpload;
using (var stream = new System.IO.FileStream(inputFile.Path, System.IO.FileMode.Open))
{
requestUpload = service.Files.Create(fileMetadata, stream, "image/jpeg");
requestUpload.Fields = "id";
requestUpload.Upload();
}
var imgFile = requestUpload.ResponseBody;
Debug.WriteLine("File ID: " + imgFile.Id);
// Copy image and paste as document
var textMetadata = new Google.Apis.Drive.v3.Data.File();
textMetadata.Name = inputFile.Name;
textMetadata.Parents = new List<string> { folderId };
textMetadata.MimeType = "application/vnd.google-apps.document";
FilesResource.CopyRequest requestCopy = service.Files.Copy(textMetadata, imgFile.Id);
requestCopy.Fields = "id";
requestCopy.OcrLanguage = "zh";
var textFile = requestCopy.Execute();
// Now we export document as plain text
FilesResource.ExportRequest requestExport = service.Files.Export(textFile.Id, "text/plain");
string output = requestExport.Execute();
Не используйте служебную учетную запись. Если вы хотите загрузить свою учетную запись, вам просто нужно получить соответствующий токен доступа для своей учетной записи. Использование промежуточной учетной записи с использованием общих папок действительно ужасно (imho).