_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]');
}
如此修改后能正常上传,但不知是否有其他副作用?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到 _getFileSize requires Buffer/File/String
这个错误,通常意味着阿里云OSS SDK在尝试获取文件大小时,没有识别到一个有效的Buffer、File或String对象。根据你的描述,问题出在WebUploader选取的file对象未能被正确识别为File类型。
确认File对象: 首先确保WebUploader确实返回了一个标准的File对象。你可以在调用multipartUpload
之前,打印出文件对象并检查其类型,以确认它是否符合预期:
console.log(file instanceof File); // 应该输出true
如果这里输出为false
,可能需要检查WebUploader的配置或者使用方式是否有误。
修改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接口的对象。
更新SDK版本: 确保你使用的阿里云OSS SDK是最新或至少是比较新的版本。有时候,这类问题可能是由于旧版本SDK与新浏览器特性或第三方库不兼容导致的。查看阿里云官方文档或GitHub仓库,获取最新的SDK版本并尝试升级。
直接传递Blob对象: WebUploader在处理文件时,可能会给你一个Blob对象而不是File对象。如果你确定上述方法都无法解决问题,可以尝试将WebUploader的Blob对象直接转换为File对象再上传,因为OSS SDK对File对象的支持更为广泛和稳定。可以通过以下方式创建File对象:
var fileObject = new File([blob], "filename.ext", {type: blob.type});
然后使用这个fileObject
进行上传操作。
请按照以上建议逐一尝试,应该能解决你遇到的问题。如果问题依旧,请提供更多详细信息以便进一步分析。