带有options = {base64encode:true}的filepicker.read()从CDN提供未编码的数据

时间:2017-06-20 17:03:49

标签: javascript filepicker.io

我有一个二进制文件被选中/上传到cdn.filepicker.io/api/file/。 文件是Excel(.xlsx,mimetype =" application / vnd.openxmlformats-officedocument.spreadsheetml.sheet")。

接下来我尝试读取文件,进行一些更改并使用filepicker v2将其写回。我直接使用filepicker v2 API文档中的代码,并将blob替换为我上传的文件:

/* Blob from a previous pick */
var blob = {
    url: 'https://cdn.filepicker.io/api/file/<handle>',
    filename: 'spreadsheet.xlsx',
    mimetype: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    isWriteable: true,
    size: 72123
};

filepicker.read(
    blob,
    {base64encode: true},
    function(data){
        console.log("Read successful");
        // Here I'm processing data.
    },
    function(fperror) {
    //  console.log(FPError.toString()); - print errors to console
    }
);

问题:

然而,带有options = {base64encode:true}的filepicker.read()调用接收未编码的文件 - 它将数据(类型为&#34;字符串&#34;)返回给onSuccess()回调,其中大部分是bytes作为原始文件中的二进制数据。不幸的字节被卡住了。

在浏览器调试器中检查文件数据我看到数据肯定不是base64编码的,而且0xA0以上的字节值被替换为utf8字节码(每个原始字节超过一个字节)。

进一步挖掘,如果我使用filepicker_js客户端代码准备的链接(例如https://cdn.filepicker.io/api/file/?base64encode = true&amp; ...)在浏览器中下载文件,我会得到原始文件,而不是base64编码。

检查filepicker_js代码,它使用xhr,但不在其上设置任何二进制传输选项(例如responseType =&#34; blob&#34;或&#34; arraybuffer&#34;,从responseText获取数据),如果数据是纯二进制的,未编码的,这是获得utf8转换的可靠方法。只有在发送之前CDN base64编码它才能使用二进制文件。

为了更进一步,我创建了自己的代码来从CDN读取文件,非常类似于filepicker的读取(甚至使用相同的组合URL),但在xhr实现中我设置了responseType =&# 34; arraybuffer&#34;,收到.response而不是.responseText,数据到达时没有损坏,正确的二进制文件。它与原始文件100%匹配。

BTW,在文档页面https://www.filestack.com/docs/javascript-api/read/v2上显示图像的示例代码似乎正常工作,并将base64编码的数据传递给元素。我跟着源中的调用树,它使用FileReader作为本地文件(不是CDN案例!)并通过fp.base64.encode()传递数据。

我的结论:

  1. filepicker CDN已损坏,base64encode参数被忽略。
  2. 不能对来自filepicker CDN
  3. 的任何二进制文件使用filepicker.read()
  4. 代码检查显示选项&#34; asText&#34;可能需要。我尝试使用和不使用CDN读取没有区别 - 通过URL参数将其发送到CDN不会改变CDN行为。
  5. 问题:

    1. 上面发布的代码中有什么我做错了吗?
    2. 是否有任何应该检查的设置(在客户端或开发人员门户网站上)?
    3. 如何修复CDN(base64encode = true)?
    4. 如何修复filepicker_js源代码和文档?

1 个答案:

答案 0 :(得分:0)

看起来服务器的响应总是假设文件是​​base64encoded并因此不编码它,因为它认为文件已被转换。我将确保Filestack团队解决这个问题。 此外,有关文件上传或文档的任何问题或意见总是欢迎来自support@filestack.com