2015-08-03 4 views
5

Я использую google's php client library, чтобы поговорить с gmail api.Получить файл с расшифрованным файлом вложения с помощью gmail API

Я пытаюсь сообщить размер файла вложения с помощью этого API.

Чтобы проверить это, я отправил себе электронное письмо с приложением. Я знал, что размер этого приложения составляет 511 КБ. Отчеты Gmail веб-интерфейс это вложение, как 499KB, который я полагаю достаточно близко:

499KB image

Когда я получать изображения с помощью gmail json api, однако, я получаю правильный размер вложения:

GET https://www.googleapis.com/gmail/v1/users/me/messages/14ef5015d08312fd/attachments/ANGjdJ-Yy2H2avT5aFV7akMM2Lp4NigSpHqKgMT48zUMPVe3l6B9U0cfs-jXYD3cWJPhEwVjXQxNg2ZGDBFXKpMnf1HbpoBCwzcuOYSAJmHBbMHGANWKynofHf5GyStvjHhvNpA5xwla2hj7zdm6SVISoMgAR-dHJIPXbRniHVdryv13bxNsUeuRFvYbktnAcIwi-ppD6C1VAJtnGQYIKtNjsOa68hOlMSGLByWOrbB2txEN_P4cM43U7SEEzFmIDjFhKGkEIiU1rvrf9WT8KFVTsJ1U9_nTFjfkXIjl_Q?key={YOUR_API_KEY} 

возвращает

{ 
"size": 510808, 
"data": "encoded_data_string_uiasd82187" 
} 

Так есть небольшой разрыв между тем, что показывает UI Gmail веб и то, что Actua l размер прикрепления. Но вот где он получает странно:

Когда я делаю запрос на whole message (а не только вложение) иначе, запрос, как это:

GET https://www.googleapis.com/gmail/v1/users/me/messages/14ef5015d08312fd?key={YOUR_API_KEY} 

я получаю ответ JSON, как это:

"body": { 
    "attachmentId": "ANGjdJ9P-2Q_1lMch1_smv_ZKACDE_QRtBisZ8bAWP1x_-ze8tvQiQunNCjcWUDkv2kjZo67AETe6Zmti5YZ3Zl4-EyaNtbtfxWOHBhTqQFSK673hZhEWW8Bg7Ul4ws2eOSYXrZsvWY8NhLptXJP5PM0W30LZk2sHj4XLWlmU64YxMPAOXwLOT1FeNc3EgVvlKJFQv1sUVajmA6c1K_qKgH_Y_c56fSJAz9aFRoh9RW6wvkhTV5NeLm9WFghkzpInwz6cm-DyJQhY-eOZLE2mvqQ4EmCPmBgzwNDh29mqQ", 
    "size": 699004 
    } 

Таким образом, приложение с идентификатором, которое я ищу, похоже, имеет размер 699 КБ, а не 511 КБ истинного размера. Кажется, это размер закодированного вложения, а не необработанный файл.

Таким образом, с помощью клиентской библиотеки PHP, когда у меня есть Google_Service_Gmail_MessagePart, представляющий эту привязанность, и я называю $messagepart->getBody()->getSize() это возвращает 699004.

Что мне нужно, это истинный размер вложений, 510808.

Как я могу получить этот истинный размер, и есть ли ошибка в API gmail, показывающая неправильный размер в этом контексте?

+0

Я зарегистрировал [hug] (https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4498) проблему с API-интерфейсом Google Apps трекер. – Rafa

ответ

1

Это, кстати, недостаток кодировки base64.

Очень грубо, окончательный размер в кодировке Base64 двоичных данных равен 1,37 раза от исходного размера данных + 814 байт (для заголовков). Размер расшифрованных данных может быть аппроксимирована с этой формулой:

байт = (string_length (encoded_string) - 814)/1,37

Википедии

Это соответствует вашему примеру очень хорошо (511 * 1,37 ≈ 700).

+0

Я использую это, но игнорирую константу 814 - для больших файлов это не будет значительным, а для очень маленьких файлов это будет вводить в заблуждение (500-байтный файл будет выглядеть ~ -500, что кажется супер неправильным) , – johncorser