我有一个二进制文件被挑选/上传到 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()传递数据。
我的结论:
- 文件选取器 CDN 已损坏,base64encode 参数被忽略。
- 不能对文件选取器 CDN 中的任何二进制文件使用 filepicker.read()
- 代码检查显示可能需要选项"asText"。我尝试过有和没有,CDN 读取没有区别 - 通过 URL 参数将其发送到 CDN 不会改变 CDN 行为。
问题:
- 上面发布的代码中是否有我做错或遗漏的地方?
- 是否有任何应检查的设置(在客户端或开发人员门户中)?
- 如何修复 CDN(base64encode=true)? 如何修复
- filepicker_js源和文档?
看起来来自服务器的响应总是假设文件是base64编码的,因此没有对其进行编码,因为它认为文件已经被转换。我将确保Filestack团队对此进行补救。 此外,欢迎您对文件上传或文档有任何疑问或意见,support@filestack.com