public static function download($url, $directory, $filename = NULL) { $url = str_replace(' ', '%20', $url); if (!Valid::url($url)) { return FALSE; } $curl = curl_init($url); $file = Upload_Util::combine($directory, uniqid()); $handle = fopen($file, 'w'); $headers = new HTTP_Header(); curl_setopt($curl, CURLOPT_FILE, $handle); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($curl, CURLOPT_HEADERFUNCTION, array($headers, 'parse_header_string')); if (curl_exec($curl) === FALSE or curl_getinfo($curl, CURLINFO_HTTP_CODE) !== 200) { fclose($handle); unlink($file); throw new Kohana_Exception('Curl: Download Error: :error, status :status on url :url', array(':url' => $url, ':status' => curl_getinfo($curl, CURLINFO_HTTP_CODE), ':error' => curl_error($curl))); } fclose($handle); if ($filename === NULL) { if (!isset($headers['content-disposition']) or !($filename = Upload_Util::filename_from_content_disposition($headers['content-disposition']))) { $mime_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE); $url = urldecode(curl_getinfo($curl, CURLINFO_EFFECTIVE_URL)); $filename = Upload_Util::filename_from_url($url, $mime_type); } } $filename = substr(pathinfo($filename, PATHINFO_FILENAME), 0, 60) . '.' . pathinfo($filename, PATHINFO_EXTENSION); $result_file = Upload_Util::combine($directory, $filename); rename($file, $result_file); return is_file($result_file) ? $filename : FALSE; }
/** * @dataProvider data_filename_from_content_disposition */ public function test_filename_from_content_disposition($content_disposition, $expected_filename) { $filename = Upload_Util::filename_from_content_disposition($content_disposition); $this->assertSame($expected_filename, $filename); }