OSS 的 driver 如下函数:
/**
* 保存指定文件
* @param array $file 保存的文件信息
* @param boolean $replace 同名文件是否覆盖
* @return boolean 保存状态,true-成功,false-失败
*/
public function save(&$file, $replace = true)
{
$_headers = array('Content-Type: ' . $file['type']);
$resource = fopen($file['tmp_name'], 'r');
$path = trim($file['rootPath'], '.') . $file['savepath'] . $file['savename'];
$uri = "/{$this->config['bucket']}{$path}";
// $file['url'] = 'http://' . $this->config['oss_host'].'.aliyuncs.com' . $uri;
if (stripos($file['type'], 'image') === false) {
$file['url'] = 'http://' . $this->config['oss_host'] . '.aliyuncs.com' . $uri;
} else {
$file['url'] = 'http://' . $this->config['bind_host'] . $path;
}
$ch = curl_init('http://' . $this->config['oss_host'] . '.aliyuncs.com' . $uri);
$date = gmdate('D, d M Y H:i:s \G\M\T');
array_push($_headers, "Date: {$date}");
$sign_string = "PUT\n\n" . $file['type'] . "\n" . $date . "\n" . $uri;
$sign = $this->hex_to_base64(hash_hmac('sha1', $sign_string, $this->config['access_key']));
array_push($_headers, 'Authorization: OSS ' . $this->config['access_id'] . ':' . $sign);
fseek($resource, 0, SEEK_END);
$length = ftell($resource);
fseek($resource, 0);
array_push($_headers, "Content-Length: {$length}");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_INFILE, $resource);
curl_setopt($ch, CURLOPT_INFILESIZE, $length);
curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->config['timeout']);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
fclose($resource);
if ($status == 200) {
return true;
} else {
$this->error = $response;
return false;
}
}
红色部分判断是不是图片BUG。在活动模块上传图片是用Flash,文件的type为application/octet-stream,导致误判为非图片,无法正常使用OSS的图片处理功能,所以显示不出来。
请登录后评论~