$this->foldersTree]); } public function main(Request $request) { return view('main',['foldersTree' => $this->foldersTree]); } /* * 分类列表 */ public function gallery(Request $request) { $search = $request->input('search', ''); if ($search) { $search = trim($search); $searchLike = '%' . $search . '%'; $albums = SiteAlbum::where('model', 'like', $searchLike)->orderBy('id', 'desc')->get(); $title = '搜索'.$search.'结果:'; $folder_id = 0; $father_id = 0; if ($albums) { $albums = $albums->toArray(); } } else { $folder_id = $request->input('fid',$this->getFoldersTreeFirstId()); $father_id = $this->getFoldersTreeFatherId($folder_id); $folder = SiteAlbumFolder::find($folder_id); $albums = SiteAlbum::where('folder_id', $folder_id)->orderBy('order', 'desc')->orderBy('id', 'desc')->get(); $albums = $albums->toArray(); $title = $folder->title; } foreach ($albums as $key => $album) { $cover = json_decode($album['cover']); foreach ($cover as $k => $v) { $cover[$k] = ossUrl($v); } $cover = empty($cover) ? ['/static/images/noimg.jpg'] : $cover; $albums[$key]['cover'] = $cover; } // 面包屑导航 $breadcrumb = getBreadcrumb($folder_id, $this->foldersTree); if ($breadcrumb) { $breadcrumb = implode('/', $breadcrumb) . '/'; } else { $breadcrumb = ''; } return view('gallery', [ 'foldersTree' => $this->foldersTree, 'folderName'=> $title, 'folder_id' => $folder_id, 'father_id' => $father_id, 'albums' => $albums, 'breadcrumb' => $breadcrumb, ] ); } public function detail(Request $request) { $id = $request->input('id',0); $album = SiteAlbum::find($id); $bumFolder = SiteAlbumFolder::where('id', $album->folder_id)->first(); $showTabs = []; if ($bumFolder) { $row = json_decode($bumFolder->show_tabs); $row[7] = '7'; foreach ($row as $key => $value) { $column = ''; $title = ''; switch ($value) { case '0': $column = 'cover'; $title = '主图'; break; case '1': $column = 'en_detail'; $title = '英文详情'; break; case '2': $column = 'cn_detail'; $title = '中文详情'; break; case '3': $column = 'video'; $title = '视频'; break; case '4': $column = 'poster'; $title = '海报'; break; case '5': $column = 'cert'; $title = '证书'; break; case '6': $column = 'pdf'; $title = 'PDF'; break; case '7': $column = 'parameters'; $title = '属性'; break; } $content = json_decode($album[$column], true); if (empty($content) == false) { $showTabs[$key] = ['value'=>$value,'column'=>$column, 'title'=>$title]; } } } // dd(json_decode($album['parameters'], true)); $album = $album->toArray(); $album['video'] = SitePreviewVideo::changeVideo($album['id'],$album['video']); //dd($album); if ($bumFolder->title == $this->posterName) { $album['poster'] = SiteAlbum::getAllPoster($album['title']); } return view('gallery-detail',[ 'foldersTree' => $this->foldersTree, 'album' => $album, 'showTabs' => $showTabs ]); } public function updateLog(Request $request) { $losgs = SiteAlbumLog::getFormattedLogs(); return view('update_log',[ 'foldersTree' => $this->foldersTree, 'logs' => $losgs ]); } /* * 下载全部 */ public function downloadAll(Request $request) { Session::put('downloadAllStatus', '1'); $id = $request->input('id', 0); $tab = $request->input('tab', 'cover'); $album = SiteAlbum::find($id); if ($album) { $album = $album->toArray(); if (isset($album[$tab])) { $files = json_decode($album[$tab]); $fileUrls = []; // 获取所有图片的 URL foreach ($files as $key => $value) { $fileUrl = ossUrl($value); // 获取完整的图片 URL $fileUrls[] = $fileUrl; // 将图片 URL 存入数组 } // 创建一个临时 ZIP 文件 $zipFileName = 'album_' . $id . '_' . $tab . '.zip'; $zipPath = storage_path('app/' . $zipFileName); $zip = new ZipArchive; if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { foreach ($fileUrls as $fileUrl) { $fileContent = file_get_contents($fileUrl); // 下载图片内容 $fileName = basename($fileUrl); // 获取文件名 $zip->addFromString($fileName, $fileContent); // 将图片添加到 ZIP 文件中 } $zip->close(); // 提供 ZIP 文件下载 Session::put('downloadAllStatus', '2'); return response()->download($zipPath, $zipFileName)->deleteFileAfterSend(true); } else { Session::put('downloadAllStatus', '2'); return response()->json(['error' => '系统正在下载中,请稍后再试','status'=> 500]); } } else { Session::put('downloadAllStatus', '2'); return response()->json(['error' => '未找到指定的 Tab 数据','status'=> 404]); } } else { Session::put('downloadAllStatus', '2'); return response()->json(['error' => '未找到相册','status'=> 404]); } } /* * 下载图片 */ public function downloadImage(Request $request) { Session::put('downloadAllStatus', '1'); $imageUrl = $request->input('url'); $imageUrl = strtok($imageUrl, '?'); $urlWithoutQuery = parse_url($imageUrl, PHP_URL_PATH); $fileName = basename($urlWithoutQuery); //下载图片 $fileContent = file_get_contents($imageUrl); $headers = [ 'Content-Type' => 'image/jpeg', 'Content-Disposition' => 'attachment; filename='. $fileName, ]; Session::put('downloadAllStatus', '2'); return response($fileContent, 200, $headers); } /* * 下载视频 */ public function download(Request $request) { $url = $request->input('url'); $url = ossUrl($url); $fileName = basename($url); $extension = pathinfo($fileName, PATHINFO_EXTENSION); if (env('OSS_HOST_INTERNAL')) { //用内网地址下载视频 $url = str_replace(env('OSS_HOST'), env('OSS_HOST_INTERNAL'), $url); } if ($extension == 'mp4') { header('Content-Type: video/mp4'); } else { //pdf header('Content-Type: application/pdf'); } header('Content-Disposition: attachment; filename="' . $fileName . '"'); header('Content-Length: ' . (string) get_headers($url, 1)['Content-Length']); // 获取远程文件大小[3](@ref) // 2. 分块输出文件流(避免内存溢出) ob_clean(); flush(); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_exec($ch); curl_close($ch); exit; } public function getDownloadAllStatus(Request $request) { $reset = $request->input('reset', 0); if ($reset) { Session::put('downloadAllStatus', '0'); } $status = Session::get('downloadAllStatus',0); return response()->json(['status' => $status]); } /* * 更新日志 */ public function nextLog(Request $request) { $id = $request->input('id', 0); $log = SiteAlbumLog::getNextLogEntry($id); if ($log) { return response()->json(['status' => 'success', 'data' => $log]); } else { return response()->json(['status' => 'error', 'data' => []]); } } //获取分类树父ID private function getFoldersTreeFatherId($folder_id) { foreach ($this->foldersTree as $key => $value) { $father_id = $value['id']; if ($folder_id == $value['id']) { return $father_id; } foreach ($value['children'] as $k => $v) { if ($folder_id == $v['id']) { return $father_id; } foreach ($v['children'] as $kk => $vv) { if ($folder_id == $vv['id']) { return $father_id; } } } } return 0; } //返回分类树第一个无子节点的ID private function getFoldersTreeFirstId() { foreach ($this->foldersTree as $key => $value) { if (isset($value['children'])) { foreach ($value['children'] as $k => $v) { return $v['id']; } } else { return $value['id']; } } return 0; } }