использование больших двоичных объектов appengine для двоичных данных в приложении obj-c

Я пишу приложение obj-c и хотел бы загрузить двоичный файл размером в несколько мегабайт на мой сервер appengine (python). Я предполагаю, что мне нужно использовать объект blob для этого, но я не уверен, как это сделать. До сих пор я использовал HTTP-запросы и ответы для отправки и получения данных, но они были закодированы в строках. Может ли кто-нибудь посоветовать, как мне сделать то же самое с каплями из приложения obj-c? Я вижу несколько примеров, которые включают HTTP-запросы, но они, похоже, ориентированы на веб-страницу, и я не очень хорошо с ней знаком. Возможно, есть какие-нибудь достойные учебники или пошаговые руководства?

Я в основном не совсем уверен, если я должен закодировать его в http-запрос и отправить его обратно через ответ, как получить двоичные данные в строку http от клиента и как правильно отправить его обратно из сервер при загрузке моих двоичных данных. Я думаю, что, возможно, подход должен полностью отличаться от того, к чему я привык, с кодированием значений в моем запросе в формате стиля param1=val¶m2=val2, но неуверенно.

Должен ли я использовать для этого службу blobstore? Одно важное замечание: я слышал, что для больших двоичных объектов существует ограничение в 1 мегабайт, но у меня есть аудиофайлы размером 2-3 мегабайта, которые мне нужно хранить (как минимум 1,8 мегабайта).


person Joey    schedule 25.11.2010    source источник


Ответы (2)


Недавно мне пришлось сделать что-то подобное, хотя это были двоичные данные через соединение через сокет. К клиенту с помощью XML, к серверу в виде потока данных. Я закончил тем, что base64 кодировал двоичные данные при отправке туда и обратно. Это немного многословно, но особенно на стороне клиента это упростило работу, не нужно беспокоиться о специальных символах в моем XML. Затем я перевел его с помощью NSData в настоящий двоичный формат. Я использовал этот код для кодирования и декодирования, поиск "cyrus", чтобы найти фрагмент, который я использовал, есть несколько, которые будут работать здесь.

В вашем случае я бы изменил ваш http-запрос на вызов почтовых данных, а не помещал все это в URL-адрес. Если вы не уверены, в чем разница, посмотрите здесь.

Я не так хорошо знаком с python, но вы можете попробовать здесь, чтобы получить помощь по этому вопросу. .

Надеюсь, это поможет.

Изменить - похоже, что капли - это путь. Взгляните на эту ссылку для строки/блоба. type, а также перейдите по этой ссылке, чтобы получить дополнительные сведения о работе с большим двоичным объектом.

person slycrel    schedule 03.12.2010
comment
Я также предполагаю, что у вас есть возможность кодировать/декодировать это с помощью сервера appengine, но я никогда не использовал его, поэтому я думаю, что это может быть вне окна, если это не так. Если вы не можете, лучше сохранить его в виде BLOB-объекта, чем кодировать и хранить в виде текста. - person slycrel; 04.12.2010
comment
спасибо за наводку на вещи. Я проверю это. Я почти уверен, что мне придется использовать большие двоичные объекты из-за ограничений по размеру для других типов объектов (до сих пор не подтверждено). Я обновлю свой оригинальный пост, чтобы упомянуть об этом. - person Joey; 04.12.2010
comment
Просто потратил несколько минут и немного посмотрел на appengine API. Я обновлю свой ответ некоторыми ссылками, но похоже, что у вас уже должны быть инструменты, доступные в Google, и вы должны использовать капли. Кроме того, похоже, что ограничение размера большого двоичного объекта составляет 1 МБ. - person slycrel; 04.12.2010
comment
Я заметил, что в документах blobstore говорится, что приложения позволяют обслуживать объекты данных размером до 2 гигабайт, что меня смущает, как это связано с ограничением в 1 мегабайт для больших двоичных объектов. У меня есть большие аудиофайлы, которые я хочу сохранить, размер которых составляет несколько мегабайт, по крайней мере чуть меньше 2. Означает ли это, что мне нужно разбить их или использовать другой подход? (обновит основной вопрос) - person Joey; 10.12.2010
comment
Если ваши большие двоичные объекты превышают лимит (если это 1 или 2 МБ, не знаю), вам нужно будет разбить их на отдельные части. Это не должно быть сложно сделать с помощью NSData. Надеюсь, ты разберешься с этим. - person slycrel; 10.12.2010

Здесь три вопроса в одном:

  1. Следует ли использовать BLOB для двоичных данных?
  2. Как вы публикуете двоичные данные и используете их из движка приложения
  3. Как вы извлекаете двоичные данные из движка приложения

Я не могу ответить, «следует ли» вам использовать большие двоичные объекты, только вы знаете ответ на этот вопрос, и это сильно зависит от типа данных, которые вы пытаетесь сохранить, и от того, как они будут использоваться. Возьмем, к примеру, изображение (вероятно, это самый популярный вариант использования). Вы хотите, чтобы пользователи сделали фото на свой телефон, загрузили его, а затем поделились им с другими пользователями. Это хорошее использование больших двоичных объектов, но, как предполагает @slycrel, вы столкнетесь с ограничениями на размер записи. Это может сработать, например, вы можете использовать библиотеку изображений python (pil) для уменьшения размера изображения.

Чтобы опубликовать двоичные данные, см. этот вопрос . Лучше всего кешировать 2 копии, миниатюру и полный размер. Таким образом, изменение размера должно произойти только один раз, при загрузке. Если вы хотите пойти еще дальше, вы можете использовать новую функцию фоновых заданий ядра приложения, чтобы поставить обработку изображений в очередь на потом. В любом случае вам нужно вернуть идентификатор вновь созданного большого двоичного объекта, чтобы вы могли ссылаться на него с устройства без дополнительного HTTP-запроса.

Я думаю, что для извлечения данных лучшим подходом было бы рассматривать BLOB как собственный ресурс. Настройте свои маршруты таким образом, чтобы любой данный большой двоичный объект имел уникальный URL-адрес:

http://myweb/images/(thumbnail|fullsize)/<blobid>.(jpg|png|gif)

Где BLOBID является динамическим, а JPG, PNG или GIF могут использоваться для получения определенного типа изображения. Миниатюру или полный размер можно использовать для получения уменьшенной или увеличенной версии, которую вы сохранили, когда они ее опубликовали.

person slf    schedule 09.12.2010