使用gmail API获取已解码的附件文件大小

joh*_*ser 5 php google-api google-api-php-client gmail-api

我正在使用谷歌的php客户端库与gmail api交谈.

我试图使用此API报告附件的文件大小.

我要测试一下,我给自己发了一封带附件的电子邮件.我知道这个附件的大小是511KB.gmail web ui将此附件报告为499KB,我认为这个附件足够接近:

499KB图像

但是,当我使用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}
Run Code Online (Sandbox Code Playgroud)

回报

{
 "size": 510808,
 "data": "encoded_data_string_uiasd82187"
}
Run Code Online (Sandbox Code Playgroud)

因此,gmail Web UI显示的内容与附件的实际大小之间存在轻微的脱节.但这里变得奇怪:

当我请求整个消息(不仅仅是附件)aka时,这样的请求:

GET https://www.googleapis.com/gmail/v1/users/me/messages/14ef5015d08312fd?key={YOUR_API_KEY}
Run Code Online (Sandbox Code Playgroud)

我得到像这样的json响应:

"body": {
     "attachmentId": "ANGjdJ9P-2Q_1lMch1_smv_ZKACDE_QRtBisZ8bAWP1x_-ze8tvQiQunNCjcWUDkv2kjZo67AETe6Zmti5YZ3Zl4-EyaNtbtfxWOHBhTqQFSK673hZhEWW8Bg7Ul4ws2eOSYXrZsvWY8NhLptXJP5PM0W30LZk2sHj4XLWlmU64YxMPAOXwLOT1FeNc3EgVvlKJFQv1sUVajmA6c1K_qKgH_Y_c56fSJAz9aFRoh9RW6wvkhTV5NeLm9WFghkzpInwz6cm-DyJQhY-eOZLE2mvqQ4EmCPmBgzwNDh29mqQ",
     "size": 699004
    }
Run Code Online (Sandbox Code Playgroud)

因此,我正在寻找的ID的附件似乎有699KB的大小,而不是511KB的真实大小.这似乎是编码附件的大小而不是原始文件.

所以,使用PHP客户端库,当我有一个Google_Service_Gmail_MessagePart代表这个附件时,我调用$messagepart->getBody()->getSize()它返回699004.

我需要的是附件的真实尺寸,510808.

我怎样才能获得这个真实的大小,并且gmail API中是否存在显示此上下文中错误大小的错误?

Tho*_*lle 1

恐怕这就是 base64 编码的缺点。

\n\n
\n

粗略地说,Base64 编码的二进制数据的最终大小等于原始数据大小的 1.37 倍 + 814 字节(对于标头)。解码数据的大小可以用以下公式估算:

\n\n

字节 = (字符串长度(编码字符串) - 814) / 1.37

\n\n

维基百科

\n
\n\n

这非常适合您的示例(511 * 1.37 \xe2\x89\x88 700)。

\n