App\Http\Controllers\UpdateController::download PHP Method

download() public method

public download ( Illuminate\Http\Request $request )
$request Illuminate\Http\Request
    public function download(Request $request)
    {
        $action = $request->input('action');
        if (!$this->newVersionAvailable()) {
            return;
        }
        $release_url = $this->getReleaseInfo($this->latestVersion)['release_url'];
        $file_size = Utils::getRemoteFileSize($release_url);
        $tmp_path = session('tmp_path');
        switch ($action) {
            case 'prepare-download':
                $update_cache = storage_path('update_cache');
                if (!is_dir($update_cache)) {
                    if (false === mkdir($update_cache)) {
                        exit('创建下载缓存文件夹失败,请检查目录权限。');
                    }
                }
                $tmp_path = $update_cache . "/update_" . time() . ".zip";
                session(['tmp_path' => $tmp_path]);
                return json(compact('release_url', 'tmp_path', 'file_size'));
                break;
            case 'start-download':
                if (!session()->has('tmp_path')) {
                    return "No temp path is set.";
                }
                try {
                    Utils::download($release_url, $tmp_path);
                } catch (\Exception $e) {
                    Storage::remove($tmp_path);
                    exit('发生错误:' . $e->getMessage());
                }
                return json(compact('tmp_path'));
                break;
            case 'get-file-size':
                if (!session()->has('tmp_path')) {
                    return "No temp path is set.";
                }
                if (file_exists($tmp_path)) {
                    return json(['size' => filesize($tmp_path)]);
                }
                break;
            case 'extract':
                if (!file_exists($tmp_path)) {
                    exit('No file available');
                }
                $extract_dir = storage_path("update_cache/{$this->latestVersion}");
                $zip = new ZipArchive();
                $res = $zip->open($tmp_path);
                if ($res === true) {
                    Log::info("[ZipArchive] Extracting file {$tmp_path}");
                    try {
                        $zip->extractTo($extract_dir);
                    } catch (\Exception $e) {
                        exit('发生错误:' . $e->getMessage());
                    }
                } else {
                    exit('更新包解压缩失败。错误代码:' . $res);
                }
                $zip->close();
                if (Storage::copyDir($extract_dir, base_path()) !== true) {
                    Storage::removeDir(storage_path('update_cache'));
                    exit('无法覆盖文件。');
                } else {
                    Log::info("[Extracter] Covering files");
                    Storage::removeDir(storage_path('update_cache'));
                    Log::info("[Extracter] Cleaning cache");
                }
                return json('更新完成', 0);
                break;
            default:
                # code...
                break;
        }
    }