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

Get decoded attachment file size with gmail API

我正在使用 google 的 php client library 与 gmail api 通信。

我正在尝试使用此 API 报告附件的文件大小。

为了测试这个,我给自己发了一封带有附件的电子邮件。我知道这个附件的大小是 511KB。 gmail 网站 ui 报告此附件为 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}

returns

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

因此,gmail 网络 UI 显示的内容与附件的实际大小之间存在轻微的脱节。但这就是它变得奇怪的地方:

当我请求 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
    }

因此,带有我要查找的 ID 的附件似乎有 699KB 的大小,而不是 511KB 的真实大小。这似乎是编码附件的大小而不是原始文件。

因此,使用 PHP 客户端库,当我有一个 Google_Service_Gmail_MessagePart 表示此附件时,我调用 $messagepart->getBody()->getSize() 这个 returns 699004.

我需要的是附件的真实大小,510808。

我怎样才能得到这个真实的大小,gmail API 中是否存在错误,在这种情况下显示错误的大小?

这恐怕是 base64 编码的缺点。

Very roughly, the final size of Base64-encoded binary data is equal to 1.37 times the original data size + 814 bytes (for headers). The size of the decoded data can be approximated with this formula:

bytes = (string_length(encoded_string) - 814) / 1.37

Wikipedia

这非常符合您的示例 (511 * 1.37 ≈ 700)。