开发者社区 问答 正文

_getFileSize requires Buffer/File/String.

_getFileSize requires Buffer/File/String.

使用的是JS直传OSS。
在使用webuploader选取出来的file文件,通过multipartUpload上传时,会报这个错误。
通过分析源码,发现将aliyun-oss-sdk.js中的

is.file = function file(obj) {
// (obj instanceof File)不能识别为File,导致Error: _getFileSize requires Buffer/File/String.
    return typeof File !== 'undefined' && (obj instanceof File || Object.prototype.toString.call(obj) === '[object File]');
                }

如此修改后能正常上传,但不知是否有其他副作用?

展开
收起
无暇之三月 2019-07-11 11:49:55 7248 分享 版权
阿里云 AI 助理回答

遇到 _getFileSize requires Buffer/File/String 这个错误,通常意味着阿里云OSS SDK在尝试获取文件大小时,没有识别到一个有效的Buffer、File或String对象。根据你的描述,问题出在WebUploader选取的file对象未能被正确识别为File类型。

解决方案

  1. 确认File对象: 首先确保WebUploader确实返回了一个标准的File对象。你可以在调用multipartUpload之前,打印出文件对象并检查其类型,以确认它是否符合预期:

    console.log(file instanceof File); // 应该输出true
    

    如果这里输出为false,可能需要检查WebUploader的配置或者使用方式是否有误。

  2. 修改is.file函数: 既然发现默认的is.file(obj)判断不通过,你可以尝试手动修改aliyun-oss-sdk.js中的这个判断逻辑,使其能够正确识别WebUploader提供的文件对象。可以尝试添加一些额外的条件来兼容WebUploader的File对象,比如检查对象是否有特定的属性(如name, size, type等):

    is.file = function file(obj) {
       return (
           typeof File !== 'undefined' &&
           (obj instanceof File ||
           (obj && obj.name && obj.size && obj.type)) // 添加对非原生File对象的兼容性检查
       );
    };
    

    这段代码尝试除了原本的instanceof检查外,还检查了对象是否具有File对象常见的属性,这有助于兼容某些环境下可能不完全符合原生File接口的对象。

  3. 更新SDK版本: 确保你使用的阿里云OSS SDK是最新或至少是比较新的版本。有时候,这类问题可能是由于旧版本SDK与新浏览器特性或第三方库不兼容导致的。查看阿里云官方文档或GitHub仓库,获取最新的SDK版本并尝试升级。

  4. 直接传递Blob对象: WebUploader在处理文件时,可能会给你一个Blob对象而不是File对象。如果你确定上述方法都无法解决问题,可以尝试将WebUploader的Blob对象直接转换为File对象再上传,因为OSS SDK对File对象的支持更为广泛和稳定。可以通过以下方式创建File对象:

    var fileObject = new File([blob], "filename.ext", {type: blob.type});
    

    然后使用这个fileObject进行上传操作。

请按照以上建议逐一尝试,应该能解决你遇到的问题。如果问题依旧,请提供更多详细信息以便进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答