使用Azure PHP SDK上传视频块Blob时出现未定义方法错误
getUseTransactionalMD5()未定义的致命错误 我来帮你搞定这个头疼的问题!先理清楚你遇到的情况:上传50MB左右的MP4视频时,只要给CreateBlobOptions设置video/mp4这个MIME类型,就会触发这个致命错误,不设置选项反而能正常上传。
问题根源
这个错误本质是SDK版本不匹配:你当前用的microsoft/azure-storage-blob包版本里,CreateBlobOptions类根本没有getUseTransactionalMD5()这个方法,但BlobRestProxy.php的1941行却硬要调用它。为啥不设置选项就没事?因为不设置时SDK走了默认逻辑分支,没触发到这段有问题的代码;一旦你加了MIME类型的配置,代码路径就走到了调用这个不存在方法的地方,直接报错。
具体解决办法
1. 优先更新SDK到兼容版本(最稳妥)
直接用Composer把Azure Blob SDK更到最新稳定版,新版本里CreateBlobOptions肯定包含这个方法,能从根本上解决问题:
composer update microsoft/azure-storage-blob
更新完之后再跑一遍上传代码,应该就能正常工作了。
2. 临时手动补全方法(紧急修复用,不推荐长期用)
如果暂时没法更新SDK,比如项目依赖限制,可以临时给CreateBlobOptions类补个方法救急:
打开vendor/microsoft/azure-storage-blob/src/Blob/Models/CreateBlobOptions.php,先确认有没有$_useTransactionalMD5这个私有属性,没有的话先加上:
private $_useTransactionalMD5 = false;
然后添加上对应的getter方法:
/** * Gets whether to use transactional MD5 * * @return bool */ public function getUseTransactionalMD5() { return $this->_useTransactionalMD5; }
⚠️ 注意:这种改源码的方式是临时的,下次跑composer install或update就会被覆盖,所以还是优先更SDK。
3. 调整选项设置逻辑(兼容旧版本的小技巧)
要是更新SDK后还有问题,或者想兼容旧版本,可以在设置MIME类型时,先检查方法是否存在再操作:
$options = new \MicrosoftAzure\Storage\Blob\Models\CreateBlobOptions(); $options->setContentType('video/mp4'); // 显式设置useTransactionalMD5(如果方法存在的话) if (method_exists($options, 'setUseTransactionalMD5')) { $options->setUseTransactionalMD5(false); }
这样能避免代码走到调用不存在方法的分支。
验证
修复完之后,再上传那个带MIME类型设置的50MB视频,确认错误消失,文件成功传到Azure Blob存储里就大功告成啦!
内容的提问来源于stack exchange,提问作者dinwal

