Сервисы облачного хранилища, что, как и какие?

В некотором смысле, я думаю, вы могли бы сказать, что я создаю что-то похожее на приложение для iOS «Vine». Социальная сеть, позволяющая пользователям загружать видео для просмотра другими. Весь мой проект почти готов, я использую службу базы данных под названием Parse, но там не так много места для хранения, и если вы хотите масштабировать его, это становится дорогим. Я решил, что могу использовать базу данных, которая у меня уже есть, и иметь sql-таблицу для «Видео» с URL-столбцом, ссылающимся на фактический видеофайл. Я искал службы хранения данных и нашел «Облачное хранилище» Google.

То, что я действительно ищу, если это возможно, похоже на этот вариант использования:

  1. В клиентском приложении есть видео, готовое к загрузке.
  2. Загружает видеофайл в some-cloud-service.com/myCompany/videoNameID.mp4
  3. Сохраните этот URL-адрес в поле URL-адреса «видео-объекта» в базе данных.
  4. Когда другие пользователи получают список видео, они получают набор имен и URL-адресов.
  5. Когда пользователь хочет воспроизвести определенное видео, выберите его по URL-адресу в таблице.

Я думал, что могу использовать облачное хранилище в качестве места для загрузки и доступа к файлам для моего приложения. Я просматривал API и документацию для облачного хранилища Google, но там так много всего, что мне не нужно, и я не понимаю большую часть этого. Я начинаю думать, что «Облачное хранилище» — это не то, что я думаю. Мне просто нужно место для загрузки потенциально огромного количества больших файлов непосредственно из iOS-приложения (а позже и с веб-сайта). Служба хранения данных, которую предлагает Parse, идеальна, но очень ограничена по размеру. Я знаю, что это может стать дорогим. Изучив цены на этот сервис Google, он выглядел одновременно дешевым и именно тем, что мне нужно, но я не могу понять, как, если это возможно, я должен использовать его для прямой загрузки файла с использованием моих «учетных данных» и получения URL-адреса в обмен на то, где файл оказался.

Могу ли я использовать для этого облачное хранилище Google? Или что-то другое? Или я совершенно неправильно понял, как использовать облачное хранилище?


person Sti    schedule 17.08.2013    source источник


Ответы (3)


На самом деле библиотека-оболочка Objective-C для сервисов Google имеет довольно подробную документацию здесь: https://code.google.com/p/google-api-objectivec-client/wiki/Introduction#Preparing_to_Use_the_Library

Он сообщает вам, что эта библиотека-оболочка создается автоматически на основе базовых API-интерфейсов JSON. Таким образом, все классы GTLStorage... будут имитировать JSON API для Google Storage. Классом для выполнения реальных вызовов API является GTLQueryStorage.

Если вы посмотрите на эту документацию JSON, вы обнаружите, что существует класс Objects, который используется для хранения данных в сегментах: https://developers.google.com/storage/docs/json_api/v1/#Objects Метод для загрузки нового объекта — "вставка".

Вернувшись к файлу GTLQueryStorage.h, вы найдете соответствующий метод Objective-C для вставки нового объекта в корзину:

// Method: storage.objects.insert
// Stores new data blobs and associated metadata.
//  Required:
//   bucket: Name of the bucket in which to store the new object. Overrides the
//     provided object metadata's bucket value, if any.
//  Optional:
//   ifGenerationMatch: Makes the operation conditional on whether the object's
//     current generation matches the given value.
//   ifGenerationNotMatch: Makes the operation conditional on whether the
//     object's current generation does not match the given value.
//   ifMetagenerationMatch: Makes the operation conditional on whether the
//     object's current metageneration matches the given value.
//   ifMetagenerationNotMatch: Makes the operation conditional on whether the 
//     object's current metageneration does not match the given value.
//   name: Name of the object. Required when the object metadata is not
//     otherwise provided. Overrides the object metadata's name value, if any.
//   projection: Set of properties to return. Defaults to noAcl, unless the
//     object resource specifies the acl property, when it defaults to full.
//      kGTLStorageProjectionFull: Include all properties.
//      kGTLStorageProjectionNoAcl: Omit the acl property.
//  Upload Parameters:
//   Accepted MIME type(s): */*
//  Authorization scope(s):
//   kGTLAuthScopeStorageDevstorageFullControl
//   kGTLAuthScopeStorageDevstorageReadWrite
// Fetches a GTLStorageObject.
+ (id)queryForObjectsInsertWithObject:(GTLStorageObject *)object
                           bucket:(NSString *)bucket
                 uploadParameters:(GTLUploadParameters *)uploadParametersOrNil;

Итак, вам следует:

  • Выделить экземпляр GTLServiceStorage
  • Установите свой ключ API для этого объекта
  • Создайте экземпляр объекта GTLQueryStorage, используя описанный выше метод класса для объекта, который вы хотите сохранить с помощью правильного сегмента.
  • Создайте сервисный билет, который выполняет запрос и получает обработчик завершения для обработки завершения (успех, ошибки).
person dirkgroten    schedule 19.08.2013
comment
Спасибо! Сейчас пытаюсь понять примеры. Прямо сейчас я пытаюсь загрузить файл, который я сохранил по URL-адресу на своем устройстве, но я не могу понять, как сделать из него GTLStorageObject. Каждый поиск GTLStorageObject приводит к очень маленькому заголовочному файлу, там просто нет никакой информации. Бьюсь об заклад, я как раз собираюсь выяснить, насколько просто на самом деле создать экземпляр GTLStorageObject, но я спрошу вас на всякий случай, знаете ли вы, где я должен искать это? - person Sti; 19.08.2013
comment
Как оказалось, я понятия не имею, как его создать. Разве метод не запрашивает загрузку объекта, когда он говорит ..insertWithObject:(GTLStorageObject*)object..? И это будет означать, что я должен преобразовать или преобразовать свой файл, в моем случае у меня есть URL-адрес локального .mp4-видео, в GTLStorageObject? В примерах они используют GTLDriveFile для Google Диска. Я углублюсь в исходные коды, чтобы посмотреть, найду ли что-нибудь, но я поражен отсутствием документации. Опять же, я только что заметил, что вся часть JSON является «экспериментальной» и каким-то образом бета-версией. (Ни в одном из примеров не используется облако:/) - person Sti; 19.08.2013
comment
Привет, Ревен, GTLStorageObject хранит только метаданные об объекте. На самом деле, когда вы загружаете данные, вам нужно только выделить/инициировать их и передать в запрос метода... который затем обновит GTLStorageObject со всеми метаданными. Вы передаете фактический файл/данные с помощью GTLUploadParameters: code.google.com/p/google-api-objectivec-client/source/browse/ - person dirkgroten; 20.08.2013
comment
Но.. Невозможно выделить/инициализировать GTLStorageObject. Я МОГУ выделить/инициализировать его как GTLObject и разыграть его, но мне кажется, что это противоречит цели..? - person Sti; 21.08.2013
comment
GTLStorageObject является подклассом GTLObject, поэтому он наследует все его методы, включая инициализацию. GTLStorageObject *aStorageObject = [GTLStorageObject object]; просто даст вам то, что вы хотите. - person dirkgroten; 21.08.2013
comment
Спасибо. Вам лично удавалось загружать в облачное хранилище? Я попробовал это сейчас и получаю исключения, говорящие, что я загружаю неправильный URL-адрес, хотя я никогда не указывал, что это была возобновляемая загрузка (хотя это то, что я действительно хочу) - person Sti; 21.08.2013
comment
Я не использовал службу хранения. Я использовал службу Диска, и, насколько я вижу, она работает очень похоже (за исключением службы Диска, вам нужно, чтобы пользователь вошел в систему, чтобы получить доступ к своему Диску). Я предлагаю вам посмотреть пример кода для Диска: code.google.com/p/google-api-objectivec-client/source/browse/, в частности, код для -(void)uploadFileAtPath:(NSString*)path в строке 620. - person dirkgroten; 21.08.2013
comment
@Rheven, вы привязаны к Google как к поставщику облачных хранилищ? Я обнаружил, что еще не так много других разработчиков, которые разработали простые оболочки для своих API, так что вы в значительной степени предоставлены сами себе. Рассматривали ли вы Amazon S3 в качестве облачного хранилища? У них есть пример проекта iOS специально для этого (загрузка фотографий в S3): aws.amazon. com/articles/SDKs/iOS/3002109349624271 - person dirkgroten; 21.08.2013
comment
Очень похоже, но в то же время не совсем. Например, я не могу присвоить моему GTLStorageObject значение .title, на самом деле я вообще ничего не могу ему присвоить. У него есть 3 метода класса, и все, я понятия не имею, как и следует ли мне их использовать. В документации по загрузке JSON в хранилище: разработчикам. google.com/storage/docs/json_api/v1/how-tos/ говорит, что я должен отправить первоначальный «пустой» запрос и получить URI, а затем указать ЭТОТ URI в качестве пункта назначения. Однако это не задокументировано в obj-c, и я не знаю, как это сделать. - person Sti; 21.08.2013
comment
Я не привязан, нет, и я просматривал веб-сайт Amazon, но было так много людей, жалующихся на то, что скорость загрузки и выгрузки S3 невероятно медленная, как килобайты, и я могу просто преждевременно почувствовать чувство, что я буду сидеть здесь, если я сейчас перейду от Google к Amazon, а Google позже расцветет с этим Google Cloud McAwesomeSpeed. - person Sti; 21.08.2013
comment
хаха, да это правда. Скорость загрузки не будет такой большой проблемой, так как большинство интернет-соединений в любом случае не имеют таких высоких скоростей загрузки, но загрузка определенно будет проблемой. Однако если вы загрузите все свои файлы в одну корзину и настроите CloudFront для этой корзины, вы сможете загружать их с помощью обычного извлечения URL-адресов, взяв вместо этого URL-адрес CloudFront, что будет очень быстро. - person dirkgroten; 21.08.2013
comment
Ой ну спасибо! Я обязательно попробую это. Я также понял, что JSON API, используемый Google Cloud Storage для Obj-C, все еще находится в бета-версии или экспериментальной версии, поэтому я не смогу выпустить свое приложение, когда оно будет готово, мне придется ждать, пока Google закончит их вещь (все URL-адреса содержат /v1beta2/). Ну, на мой первоначальный вопрос определенно дан ответ. Думаю, позже я попытаю удачу с Google Cloud Storage, если не найду общий язык с Amazon. Большое тебе спасибо! - person Sti; 21.08.2013
comment
Ваш GTLStorageObject имеет множество свойств: Итак, если вы создали экземпляр myStorageObject, вы можете делать myStorageObject.name = @"filename" и myStorageObject.contentType = @"video/mp4" и т. д. Вам не нужно делать ничего особенного для всего этого резюме. Библиотека iOS всегда использует протокол возобновляемой загрузки Google. Вы можете использовать serviceTicket для отслеживания хода выполнения, а также приостанавливать и возобновлять загрузку: code.google.com/p/google-api-objectivec-client/wiki/ - person dirkgroten; 21.08.2013
comment
Одна вещь: у Google есть много вещей в бета-версии, которые действительно можно использовать в выпущенных продуктах. Они склонны держать вещи в «бете» годами. Это просто означает меньше гарантий. Но я думаю, что в этом случае Amazon определенно надежнее, и вы найдете больше ресурсов, которые вам помогут. - person dirkgroten; 21.08.2013
comment
Нет, это странно. Я открыл GTLStorageObject и увидел все эти свойства, но не могу получить к ним доступ. Я не знаю, потому ли это, что они @dynamic, или что-то еще, но если я выберу object.name=@"filename";, то получу error:Property 'name' cannot be found in forward class object 'GTLStorageObject'. Хм.. Может быть, есть заголовок, который я должен куда-то импортировать, который не обязательно выдает ошибку из-за отсутствия, но все же нужен..? - person Sti; 21.08.2013
comment
Пришлось импортировать #import "GTLStorage" ( -________- ). Тем не менее, по-прежнему возникает та же ошибка, поэтому я предполагаю, что это должно быть что-то о том, что говорится в документации для возобновляемых загрузок. Мех. (Я просто импортировал GTLStorageObject, GTLQueryStorage и т. д.) - person Sti; 21.08.2013
comment
Могу ли я иметь эту тему, особенно в Swift? Спасибо ..:) - person Thiha Aung; 27.10.2015

поздний ответ, но это может помочь другим с этой проблемой. этот код загружает видео в GCS (проверено и работает)

Сначала аутентификация

это вызовет контроллер просмотра аутентификации Google (вы должны добавить в свой проект файл GTMOAuth2ViewTouch.xib).

- (void) uploadVideoToGoogleCloud {

// declare this
//@property (strong, nonatomic) GTLServiceStorage* serviceStorage;
//@property (strong, nonatomic) NSString* accessToken;

_serviceStorage = [[GTLServiceStorage alloc] init];
_serviceStorage = [GTLServiceStorage new];
_serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": @"yourGoogleProjectId"};

// authenticate
GTMOAuth2ViewControllerTouch *oAuthVC =
[[GTMOAuth2ViewControllerTouch alloc] initWithScope:kGTLAuthScopeStorageDevstorageReadWrite
                                           clientID:@"yourClientId from Client ID for iOS application"
                                       clientSecret:@"yourSecret from Client ID for iOS application"
                                   keychainItemName:@"use nil or give a name to save in keychain"
                                  completionHandler:^(GTMOAuth2ViewControllerTouch *viewController, GTMOAuth2Authentication *auth, NSError *error) {

                                      _accessToken = [NSString stringWithFormat:@"Bearer %@", [auth.parameters objectForKey:@"access_token"]];

                                      _serviceStorage.additionalHTTPHeaders = @{@"x-goog-project-id": kProjectID, @"Content-Type": @"application/json-rpc", @"Accept": @"application/json-rpc", @"Authorization": _accessToken};

                                      _serviceStorage.authorizer = auth;


                                      dispatch_async(dispatch_get_main_queue(), ^{
                                          [self dismissViewControllerAnimated:YES completion:nil];
                                      });
                                  }];


dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:oAuthVC animated:YES completion:nil];
});
}

Загрузить видео после аутентификации

после того, как пользователь успешно прошел аутентификацию, вызовите это, чтобы загрузить видео

// upload video file
NSString *filename = @"yourVideoFileNameNoExtension";
NSString *pathToMovie = [[NSBundle mainBundle] pathForResource:filename ofType:@".mp4"];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:pathToMovie];
if (fileHandle) {

    GTLUploadParameters *uploadParam =
    [GTLUploadParameters uploadParametersWithFileHandle:fileHandle MIMEType:@"video/mp4"];

    GTLStorageObject *storageObj = [GTLStorageObject object];
    storageObj.name = @"thisWillAppearOnTheBucketAsTheFilename";

    GTLQueryStorage *query = [GTLQueryStorage queryForObjectsInsertWithObject:storageObj bucket:@"your-bucket-name" uploadParameters:uploadParam];

    GTLServiceTicket *ticket = [_serviceStorage executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
        NSLog(@"error:%@", error ? [error description] : @"query succeeded!");
    }];


    ticket.uploadProgressBlock = ^(GTLServiceTicket *ticket,
                                   unsigned long long numberOfBytesRead,
                                   unsigned long long dataLength) {
        NSLog(@"ticket: %@", ticket);
        NSLog(@"read %llu from %llu bytes", numberOfBytesRead, dataLength);
    };

} else {
    NSLog(@"no video file handle!");
}

надеюсь это поможет :)

person lilush    schedule 10.04.2014
comment
Поздний ответ и от меня! В итоге я воспользовался услугами Amazon, но теперь я все-таки подумываю о том, чтобы перейти на Google Cloud Storage. Я вижу, что их JSON-API, наконец, вышел из бета-версии (в последний раз, когда я проверял, год назад). Однако в нашем приложении у нас есть собственная база данных, обрабатывающая пользователей, и мы не хотим, чтобы наши пользователи ДОЛЖНЫ входить в систему со своей учетной записью Google, чтобы использовать ее, поэтому первая часть вашего ответа на самом деле не работает для меня. Я попытался «пропустить» этот шаг, но взамен мне потребовался вход в систему. Есть ли способ разрешить загрузку от ЛЮБОГО (у кого есть секретный ключ (который жестко запрограммирован в приложении))? - person Sti; 28.11.2014

Да, облачное хранилище предназначено для загрузки файлов. Терминология, используемая Parse, проще, чем используемая Google. Для Google вы хотите прочитать этот документ, в частности "Реализация возобновляемых загрузок с помощью XML API», но прочитайте все это.

person Wain    schedule 17.08.2013
comment
Спасибо, я прочитаю, но на первый взгляд я вижу много того, что они называют примерами того, как загрузить файл и т. д., но я понятия не имею, как это читать. Это не любой код, который я узнаю. Вы случайно не знаете каких-либо руководств или руководств по использованию этого API Google (для моего предполагаемого использования) с iOS? Я надеялся, что это будет так же просто, как вариант использования в моем вопросе, используя что-то вроде ASIHTTPRequest для отправки файла в мой облачный домен и получения взамен полного URL-адреса, и теперь файл является общедоступным URL-адресом, например www.something .com/я/видео.mp4. - person Sti; 18.08.2013
comment
Почитав кое-что и покопавшись в этом безумии дрянной документации, я наконец нашел это: code.google.com/p/google-api-objectivec-client это доставило мне адскую головную боль, но похоже на то, что мне нужно. Спасибо. - person Sti; 18.08.2013
comment
Чтобы дать вам представление о том, на что вы смотрите, документ, на который ссылается Уэйн, описывает точные сообщения HTTP. HTTP — это протокол, на котором работает Интернет, и на самом деле вы можете использовать обычный веб-браузер для выполнения простых запросов к Google Cloud Storage. GCS имеет два интерфейса: один на основе XML, а другой на основе JSON. Многие API Google используют один и тот же стиль интерфейса JSON, и найденная вами библиотека Objective-C является оболочкой для всех из них. Соответственно, документация по JSON API облачного хранилища Google предоставит вам наибольшую помощь в том, для чего нужны отдельные параметры. - person Brandon Yarbrough; 18.08.2013
comment
@BrandonYarbrough Спасибо, к сожалению, я не могу найти документацию о том, как именно использовать эту библиотеку. Документации нет вообще. Там есть один пример того, как загружать файлы, но это с Google Диском, и мне нужно что-то с облачным хранилищем. Я решил, что мне следует использовать «сервис» GTLStorage из примера проекта, но все, что я могу найти об этих классах, — это сами классы. Я начинаю думать, что мне может не понадобиться API, просто какой-то способ загрузки файлов в мое «ведро». Я понятия не имею, как это сделать из Objective-C/iOS. - person Sti; 18.08.2013