findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $fileObjectType->modelBuilderAllowed($file->object_id)->findOrFail($file->object_id); if(! $fileObjectType){ return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } // return Storage::download( // $file->pathname, // sprintf("%s.%s", rtrim($file->title, "." . $file->extension), $file->extension) // ); return new FileDownloadResource($file); } public function changeName(Request $request,string $id) { $file = File::query()->findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $fileObjectType->modelBuilderAllowed($file->object_id)->findOrFail($file->object_id); if(! $fileObjectType){ return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } File::query()->where('title',$file->title)->where('object_type',$file->object_type)->update( [ 'title' => $request->get('title'), ] ); return $this->noContent(); } public function destroy(string $id){ $file = File::query()->findOrFail($id); $fileObjectType = FileObjectType::from($file->object_type); $fileObjectType->modelBuilderAllowed($file->object_id)->findOrFail($file->object_id); if(! $fileObjectType){ return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } File::query()->where('title',$file->title)->where('object_type',$file->object_type)->delete(); return $this->noContent(); } public function downloadZip(DownloadZipRequest $request) { $files = File::query()->whereIn("id", $request->get("ids"))->get(); foreach ($files as $file) { $object = FileObjectType::from($file->object_type) ->modelBuilderAllowed($file->object_id) ->find($file->object_id); if (! $object) { return $this->badRequest(sprintf("File ID: %s, no permission to access", $file->id)); } } return FileDownloadResource::collection($files); } /** * 文件上传 * * @param FileUploadRequest $request * @return FileUploadSuccessResource|\Illuminate\Http\JsonResponse */ public function upload(FileUploadRequest $request) { $names = $request->get("file_names", []); $fileObjectType = FileObjectType::from($request->object_type); foreach ($request->file("files") as $file) { if (! $file->isValid()) { return $this->badRequest("File upload failed."); } } $items = []; foreach ($request->file("files") as $index => $file) { $pathname = $file->storeAs( sprintf("c%s/%s/%s", Auth::user()->company_id, $fileObjectType->value, date("Ymd")), sprintf("%s.%s", md5(uniqid()), $file->extension()) ); if (! $pathname) { return $this->badRequest("File upload failed."); } $items[] = [ 'pathname' => $pathname, 'title' => $names[$index] ?? $file->getClientOriginalName(), 'size' => $file->getSize(), 'extension' => $file->extension(), 'object_type' => $request->object_type, 'object_id' => $request->object_id, 'created_by' => Auth::id(), 'company_id' => Auth::user()->company_id, 'source' => $request->get("source", 1), ]; } $uploadedFiles = []; foreach ($items as $item) { if ($item['object_id'] && $item['source'] == 1) { $version = File::query() ->where('object_type', $item['object_type']) ->where('object_id', $item['object_id']) ->where("title", $item['title']) ->count(); $item['version'] = $version + 1; } $file = File::query()->create($item); $uploadedFiles[] = new FileUploadSuccessResource($file); } return $this->success([ 'data' => $uploadedFiles ]); } public function byObject(string $objectType, string $objectId) { $fileObjectType = FileObjectType::from($objectType); $fileObjectType->modelBuilderAllowed($objectId)->findOrFail($objectId); $files = File::query() ->with(['createdBy']) ->where('object_type', $objectType) ->where('object_id', $objectId) ->orderByDesc("version") ->where("source", 1) ->get(); $items = []; foreach ($files->groupBy("title") as $fileItems) { $item = (new FileByObjectResource($fileItems->first()))->toArray(request()); $item['children'] = []; foreach ($fileItems as $fileItem) { $item['children'][] = new FileByObjectResource($fileItem); } $items[] = $item; } return $this->success([ 'data' => $items ]); } }