filepicker.read() with options={base64encode:true} 提供来自 CDN



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

接下来,我尝试读取文件,进行一些更改并使用文件选择器 v2 将其写回。我直接使用文件选取器 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() 调用接收未编码的文件 - 它将数据(类型为"字符串")返回给 onSuccess() 回调,该回调将原始文件中的大部分字节作为二进制数据。不幸的字节被卡住。

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

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

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

为了更进一步,我编写了自己的代码来从CDN读取文件,与文件选择器的读取非常相似(甚至使用相同的组合URL),但是在xhr实现中,我设置了responseType="arraybuffer",接收.response而不是.responseText,并且到达的数据不再损坏,正确的二进制。它与原始文件100%匹配。

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

我的结论:

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

问题:

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

看起来来自服务器的响应总是假设文件是base64编码的,因此没有对其进行编码,因为它认为文件已经被转换。我将确保Filestack团队对此进行补救。 此外,欢迎您对文件上传或文档有任何疑问或意见,support@filestack.com

最新更新