我觉得我错过了一些愚蠢的东西......
我正在使用适用于新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);
答案 0 :(得分:11)
解码附件数据可能存在问题。在将附件数据写入文件之前,请尝试在附件数据上使用此字符串替换。
$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);
答案 1 :(得分:1)
您还需要使用消息有效负载的文件名部分加入要存储文件的路径。
我不是特别精通php,但是在python中它将是等效的:
path = ''.join([store_dir, part['filename']])
f = open(path, 'w')
f.write(file_data)
f.close()
file_data
是您已解码的内容($data
)
答案 2 :(得分:0)
在将返回的附件数据写入文件之前,请尝试以下方法对其进行解码。
$attachment_data = urlsafe_b64decode(utf8_encode($data->data));
为我工作。