【问题标题】:Gmail API attachement Base64url decodeGmail API 附件 Base64url 解码
【发布时间】:2017-07-27 15:49:45
【问题描述】:

我目前正在尝试存储所有 gmail 电子邮件附件,女巫编码为 base64url (https://developers.google.com/gmail/api/v1/reference/users/messages/attachments)。

gmail.users.messages.attachments.get({
    'auth': auth,
    'userId': 'me',
    'id': 'attachementId',
    "messageId": 'messageId'
}, function(err, response, seg) {
    if (err) {
       //
    } else {
        var base64_attachement = response.data.replace(/-/g, '+').replace(/_/g, '/').replace(/ /g, '+');
        var buffer = new Buffer(base64_attachement, "base64");
        var attachementDecode = buffer.toString();
    }
});

但是当我将消息存储在文件或 S3 中并尝试读取它(使用良好的格式)时,我什么也看不到,并且 gimp 的图像编辑器说图像已损坏。 我究竟做错了什么 ?我真的迷路了如何解码base64url格式的谷歌附件?

【问题讨论】:

    标签: javascript node.js gmail base64 gmail-api


    【解决方案1】:

    我还从 gmail 获得附件并成功保存它们:在 Blob 对象中设置 base-64,然后您可以使用 FileSaver 库轻松将文件保存在您的计算机中。

    代码:

     var base64=(response.data).replace(/_/g, '/'); //Replace this characters 
     base64=base64.replace(/-/g, '+');
     var base64Fixed = fixBase64(base64);
     var blob = new Blob([base64Fixed], { type: "image/png" } ); //set your file type!
     saveAs(blob,"name of file"); //Using FileSaver library 
    
    
    function fixBase64(binaryData) {
      var base64str = binaryData// base64 string from  thr response of server
      var binary = atob(base64str.replace(/\s/g, ''));// decode base64 string, remove space for IE compatibility
      var len = binary.length;         // get binary length
      var buffer = new ArrayBuffer(len);         // create ArrayBuffer with binary length
      var view = new Uint8Array(buffer);         // create 8-bit Array
    
      // save unicode of binary data into 8-bit Array
      for (var i = 0; i < len; i++)
          view[i] = binary.charCodeAt(i);
    
     return view;
    }
    

    希望对您有所帮助。祝你好运

    【讨论】:

    • 感谢您的帮助!它对我帮助很大,现在我的代码可以正常工作,并且文件已正确发送到 S3
    • 谢谢@OriEng。这很有帮助。
    • 谷歌唯一有效的解决方案。我在从 Gmail API 下载附件并使用 NodeJS 将其保存为文件时遇到问题,这对我有帮助。我需要解决的一件事是 atob 在 NodeJS 中不可用,我是从 'js-base64' 获得的。
    【解决方案2】:

    一个简单的参考@OriEng的解决方案,使用js-base64

    # npm i js-base64
    const Base64 = require('js-base64')
    function decodeBase64(str) {
      str = str.replace(/_/g, '/').replace(/-/g, '+') // important line
      return Base64.atob(str)
    }
    

    【讨论】:

    • 谢谢。这确实需要出现在 Gmail API 文档的某个地方。
    猜你喜欢
    • 2016-11-21
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2014-11-08
    相关资源
    最近更新 更多