关键字: upload_file_by_file, utf-8, object_name
我用这个 SDK 写了个 WordPress 的插件,由于自己用的 ACE,不需要这个 SDK,所以一直没发现这个问题
直到最近有两个人给我反馈无法上传中文名的文件,我想可能是编码问题,仔细的测试个自己的代码,没发现问题
然后我跟踪一下 SDK 里的代码,瞬间凌乱了。。。。。
见 sdk.class.php line 1290
/**
* 上传文件,适合比较大的文件
*/
public function upload_file_by_file($bucket, $object, $file, $options = NULL){
// ..... 省略 ......
if($this->chk_chinese($file)){
$file = iconv('utf-8','gbk',$file);
}
// ..... 省略 .....
}
只判断包含中文就转 GBK,并没有检测输入字串是不是 utf8。这个倒是可以理解,因为或许在某个地方已经判断过了(我没通看源码,所以自我安慰一下,哈哈~),不过为什么要转成 GBK 呢?
在另一个地方有如下代码 line 2575
/**
* 检验object名称是否合法
* object命名规范:
* 1. 规则长度必须在1-1023字节之间
* 2. 使用UTF-8编码
*/
private function validate_object($object){
$pattern = '/^.{1,1023}$/';
if (empty ( $object ) || ! preg_match ( $pattern, $object )) {
return false;
}
return true;
}
这个到底是不是 BUG 啊?反正如果文件名有中文 报错是妥妥的,注释掉这3行,不转 GBK 反倒是没什么问题了。
为了解决用户们的问题,我对 line 1290 做了简单的修改
if($this->chk_chinese($file) && $this->is_gb2312($file)){
呼叫大大,快来看一下,改 SDK 什么的总还是有一点会觉得心虚,以后升个级什么的会不会就蛋疼了
$file = iconv('gbk','utf-8',$file);
}
PS: check_char() 和 is_gb2312() 两个方法的代码是不是有点太神似了,这样真的好吗~
有些时间没怎么写 php 了,本来底子也不好,要是我说错了什么,请各位不要笑哈~ 今天太晚了,回头我会抽空把 SDK 通看一遍的
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。