/** * Скачивание публичного файла или папки * * @param $path Путь, по которому будет сохранён файл * @return boolean * @throws mixed */ public function download($path, $overwrite = false, $progress = null) { if ($overwrite instanceof \Closure) { $progress = $overwrite; $overwrite = false; } if (is_file($path) && !$overwrite) { throw new \OutOfBoundsException('Такой файл существует, преедайте true Чтобы перезаписать его'); } if (!is_writable(dirname($path))) { throw new \OutOfBoundsException('Запись в директорию где должен быть располоен файл не возможна'); } $response = $this->getLink(); if ($progress instanceof \Closure) { $this->request->progress(function ($curl, $download, $downloaded, $upload, $uploaded) use($progress) { return $progress($download, $downloaded, $curl); }); } $this->request->setTimeout(null); $this->request->setOpt(CURLOPT_FOLLOWLOCATION, true); $this->request->download($response, $path); $this->request->setDefaultTimeout(); $this->request->progress(null); if ($this->type == 'file' && md5_file($path) != $this->md5) { throw new \RangeException('Файл скачан, но контрольные суммы различаются.'); } return $this->request->http_status_code == 200; }
/** * Скачивает файл * * @param $path Путь, по которому будет сохранён файл * @param mixed $overwrite * @param mixed $progress * @return boolean * @throws mixed */ public function download($path, $overwrite = false, $progress = null) { if (!$this->has()) { throw new Exception\NotFoundException('Не возможно скачать, данный ресурс отсутствует на диске ?'); } if ($overwrite instanceof \Closure) { $progress = $overwrite; $overwrite = false; } if (is_file($path) && !$overwrite) { throw new \OutOfBoundsException('Такой файл существует, передайте true Чтобы перезаписать его'); } if (!is_writable(dirname($path))) { throw new \OutOfBoundsException('Запись в директорию где должен быть располоен файл не возможна'); } $response = $this->request->get($this->parent_disk->getRequestUrl('resources/download', array('path' => $this->resource_path))); if (empty($response['href'])) { throw new \UnexpectedValueException('Не удалось запросить закачку, повторите заново'); } if ($progress instanceof \Closure) { $this->request->progress(function ($curl, $download, $downloaded, $upload, $uploaded) use($progress) { return $progress($download, $downloaded, $curl); }); } $put_data = $path; $this->request->setTimeout(null); $this->request->setOpt(CURLOPT_FOLLOWLOCATION, true); if ($this->hasEncrypted()) { $encrypted = $this->get('custom_properties', []); $this->phrase($encrypted['encrypted_phrase'])->vector(base64_decode($encrypted['encrypted_vector'])); $put_data = function ($instance, $fh) use($path, $encrypted) { $fp = fopen($path, 'wb'); while (!feof($fh)) { fwrite($fp, $this->decrypt(fread($fh, $encrypted['encrypted_block']))); } fclose($fp); }; } $this->request->download($response['href'], $put_data); $this->request->setDefaultTimeout(); $this->request->progress(null); if (isset($encrypted['encrypted']) && (($hash_file = $encrypted['encrypted']) || ($hash_file = $md5)) && $hash_file !== md5_file($path)) { throw new \RangeException('Файл скачан, но контрольные суммы различаются.'); } return $this->request->http_status_code == 200; }