【问题标题】:Can't open downloaded attachments from Gmail API无法从 Gmail API 打开下载的附件
【发布时间】:2014-10-01 08:08:16
【问题描述】:

我觉得我错过了一些愚蠢的东西......

我正在使用用于新 Gmail API 的 PHP SDK 从电子邮件中获取附件。我可以获取附件内容,但除非是文本文件,否则我无法在保存后打开该文件。如果附件是 PDF,则不会呈现。如果是excel文件,打不开。

我做错了什么?

// this works; I get the attachment body, etc
$data = $g->gmail->users_messages_attachments->get($email_account, $email_message_id, $p->getBody()->getAttachmentId());

$fh = fopen(DOC_ROOT."/file.pdf", "w+");
fwrite($fh, base64_decode($data->data));
fclose($fh);

【问题讨论】:

    标签: php email-attachments gmail-api


    【解决方案1】:

    您还需要在消息负载的文件名部分中加入要存储文件的路径。

    我不是特别精通php,但在python中它相当于:

    path = ''.join([store_dir, part['filename']])
    f = open(path, 'w')
    f.write(file_data)
    f.close()
    

    file_data 是您解码的内容(您的$data)

    【讨论】:

    • 我可以写入文件。但该文件不是有效的 PDF/XLS/DOC/任何文件——编码错误。
    【解决方案2】:

    解码附件数据可能存在问题。在将附件数据写入文件之前,请尝试在附件数据上使用此字符串替换。

    $data = $g->gmail->users_messages_attachments->get($email_account, $email_message_id, $p->getBody()->getAttachmentId()); // Converting to standard RFC 4648 base64-encoding // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history $data = strtr($data, array('-' => '+', '_' => '/')); $fh = fopen(DOC_ROOT."/file.pdf", "w+"); fwrite($fh, base64_decode($data->data)); fclose($fh);

    【讨论】:

    • 返回的数据是使用urlsafe base64编码返回的,所以需要按照这个答案进行替换。
    • $p->getBody()->getAttachmentId() 上的 p 是什么?你有这个函数的文档链接吗?
    • 很好的答案,从 Gmail API 返回的字符串结果 -> getAttachment 是 urlSafe base64 编码的,因此使用字符串替换我们可以对字符串结果进行 base64 编码,然后构建图像。
    • 谢谢!对了,应该是$data->data = strt($data->data,... )
    【解决方案3】:

    在将返回的附件数据写入文件之前尝试以下方法对其进行解码。

    $attachment_data = urlsafe_b64decode(utf8_encode($data->data));
    

    为我工作。

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 2016-11-23
      • 2016-02-22
      • 2022-08-24
      相关资源
      最近更新 更多