Требования к публикации:
1. Папка, содержащая файлы, должна быть общедоступной. Любые папки, добавляемые в основную директорию, также должны быть общедоступными.
2. Файлы, содержащиеся в папке, должны быть связаны между собой webViewLink API
Чтобы создать общедоступную папку программно, вам необходимо вставить MIME файл типа application/vnd.google-apps.folder (данный тип зарезервирован в Google Drive) и затем выставить необходимые разрешения (на английском). Тип аккаунта должен быть назначен на "Любой" (anyone), роль - "Для чтения" (reader). Следующие примеры показывают, как создать общедоступную папку, используя поддерживаемые и доступные библиотеки.
JAVA:
private static File createPublicFolder(Drive service, String folderName) throws IOException {
File body = new File();
body.setTitle(folderName);
body.setMimeType("application/vnd.google-apps.folder");
File file = service.files().insert(body).execute();
Permission permission = new Permission();
permission.setValue("");
permission.setType("anyone");
permission.setRole("reader");
service.permissions().insert(file.getId(), permission).execute();
return file;
}
Python:
def create_public_folder(service, folder_name):
body = {
'title': folder_name,
'mimeType': 'application/vnd.google-apps.folder'
}
file = service.files().insert(body=body).execute()
permission = {
'value': '',
'type': 'anyone',
'role': 'reader'
}
service.permissions().insert(
fileId=file['id'], body=permission).execute()
return file
PHP:
function createPublicFolder($service, $folderName) {
$file = new Google_DriveFile();
$file->setTitle($folderName);
$file->setMimeType('application/vnd.google-apps.folder');
$createdFile = $service->files->insert($file, array(
'mimeType' => 'application/vnd.google-apps.folder',
));
$permission = new Google_Permission();
$permission->setValue('');
$permission->setType('anyone');
$permission->setRole('reader');
$service->permissions->insert(
$createdFile->getId(), $permission);
return $file;
}
.NET:
private static File createPublicFolder(DriveService service, String folderName) {
File body = new File();
body.Title = folderName;
body.MimeType = "application/vnd.google-apps.folder";
File file = service.Files.Insert(body).Fetch();
Permission permission = new Permission();
permission.Value = "";
permission.Type = "anyone";
permission.Role = "reader";
service.Permissions.Insert(permission, file.Id).Fetch();
return file;
}
Ruby:
def create_public_folder(client, folder_name)
drive = client.discovered_api('drive', 'v2')
file = drive.files.insert.request_schema.new({
'title' => folder_name,
'mimeType' => 'application/vnd.google-apps.folder'
})
result = client.execute(
:api_method => drive.files.insert,
:body_object => file)
permission = drive.permissions.insert.request_schema.new({
'value' => '',
'type' => 'anyone',
'role' => 'reader'
})
file_id = result.data['id']
result = client.execute(
:api_method => drive.permissions.insert,
:body_object => permission,
:parameters => { 'fileId' => file_id })
return result.data
end
JavaScript:
function createPublicFolder(folderName) {
var body = {
'title': folderName,
'mimeType': "application/vnd.google-apps.folder"
};
var request = gapi.client.drive.files.insert({
'resource': body
});
request.execute(function(resp) {
console.log('Folder ID: ' + resp.id);
var permissionBody = {
'value': '',
'type': 'anyone',
'role': 'reader'
};
var permissionRequest = gapi.client.drive.permissions.insert({
'fileId': resp.id,
'resource': permissionBody
});
permissionRequest.execute(function(resp) { });
});
}
Использование webViewLink
Основой в использовании встроенной утилиты Google Drive и публикации сайта является webViewLink. Когда вы обращаетесь к общедоступной папке, используя files.insert, то ответ от Google Drive содержит в себе запись от webViewLink, которая выглядит примерно так:
https://googledrive.com/host/A1B2C3D4E5F6G7H8J9
Примечание: Папка в Google Drive по сути MIME файл с типом application/vnd.google-apps.folder. Более подробную информацию можно найти тут (на английском).
Как только мы получаем данный URL, наше приложение в Google Drive может его использовать, чтобы предоставлять доступ к содержимому папок. Например, ссылка на файл kittens.jpg в папке с изображениями может выглядеть как
https://googledrive.com/host/A1B2C3D4E5F6G7H8J9/images/kittens.jpg
Можно получить доступ к файлам и папкам в общедоступной папке, используя названия файлов и относительные пути вместо уникальных номеров (ID) файлов. Если добавить подобную ссылку в index.html файл, то страница отобразится вместе с изображением, как и ожидается. А если вы напрямую укажите на папку, в которой не будет index.html файла, то Google Drive отобразить простой список всех файлов каталога.
Расширение базовой идеи публикации
Возможность связывать файлы между собой подобным способом дает огромное количество возможностей для разработчиков. Написание утилиты для блогинга, создание утилит для публикаций обновлений общих документов, галереи - во всех случаях можно получить выгоду и неплохой проект на выходе. Для более нагруженных проектов, Google Drive можно рассматривать как платформу для создания сайтостроительной утилиты для других пользователей Google Drive.