我有一个二进制文件被选中/上传到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()传递数据。
答案 0 :(得分:0)
看起来服务器的响应总是假设文件是base64encoded并因此不编码它,因为它认为文件已被转换。我将确保Filestack团队解决这个问题。 此外,有关文件上传或文档的任何问题或意见总是欢迎来自support@filestack.com