AttachController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace App\Http\Controllers\Api\Course;
  3. use App\Http\Controllers\Controller;
  4. use App\Repositories\Criteria\Course\AttachCriteria;
  5. use App\Repositories\Enums\ResponseCodeEnum;
  6. use App\Repositories\Models\Course\Attach;
  7. use App\Repositories\Models\Base\Resource;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Facades\Storage;
  10. use Illuminate\Support\Str;
  11. use Jiannei\Response\Laravel\Support\Facades\Response;
  12. use Prettus\Validator\Contracts\ValidatorInterface;
  13. use App\Contracts\Repositories\Course\AttachRepository;
  14. use App\Repositories\Validators\Course\AttachValidator;
  15. /**
  16. * Class CourseAttachesController.
  17. *
  18. * @package namespace App\Http\Controllers;
  19. */
  20. class AttachController extends Controller
  21. {
  22. /**
  23. * @var AttachRepository
  24. */
  25. protected $repository;
  26. /**
  27. * @var AttachValidator
  28. */
  29. protected $validator;
  30. /**
  31. * CourseAttachesController constructor.
  32. *
  33. * @param AttachRepository $repository
  34. * @param AttachValidator $validator
  35. */
  36. public function __construct(AttachRepository $repository, AttachValidator $validator)
  37. {
  38. $this->repository = $repository;
  39. $this->validator = $validator;
  40. }
  41. public function index()
  42. {
  43. $this->repository->pushCriteria(AttachCriteria::class);
  44. $courseAttaches = $this->repository->paginate(request('per_page', self::PAGE_NUM));
  45. return Response::success($courseAttaches);
  46. }
  47. /**
  48. * 创建
  49. * @param Request $request
  50. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource|void
  51. * @throws \Illuminate\Validation\ValidationException
  52. * Author: Mead
  53. */
  54. public function store(Request $request)
  55. {
  56. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE));
  57. try {
  58. $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
  59. $data['slug'] = Str::random();
  60. $courseAttach = $this->repository->create($data);
  61. return Response::success($courseAttach);
  62. } catch (\Exception $e) {
  63. return $this->errorStore($e);
  64. }
  65. }
  66. /**
  67. * 更新
  68. * @param Request $request
  69. * @param $id
  70. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  71. * @throws \Illuminate\Validation\ValidationException
  72. * Author: Mead
  73. */
  74. public function update(Request $request, $id)
  75. {
  76. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE));
  77. try {
  78. $attaches = $this->repository->update($request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_UPDATE))), $id);
  79. return Response::success($attaches);
  80. } catch (\Exception $e) {
  81. $this->errorStore($e);
  82. }
  83. }
  84. /**
  85. * 删除
  86. * @param $id
  87. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  88. * Author: Mead
  89. */
  90. public function destroy($id)
  91. {
  92. try {
  93. $this->repository->delete($id);
  94. return Response::success(null, T('successfully delete.'));
  95. } catch (\Exception $exception) {
  96. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  97. }
  98. }
  99. /**
  100. * 文件下载
  101. * @param $id
  102. * @return \Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\BinaryFileResponse
  103. * Author: Mead
  104. */
  105. public function download($slug)
  106. {
  107. $attach = Attach::query()->where('slug', '=', $slug)->first();
  108. if ($attach) {
  109. $attach->download_times++;
  110. $attach->save();
  111. $resource = Resource::query()->find($attach->path);
  112. if (!Storage::disk($resource->disk)->exists($resource->path)) {
  113. return Response::fail('找不到文件');
  114. }
  115. return response()->download(Storage::disk($resource->disk)->path($resource->path), $resource->name, [
  116. 'Access-Control-Allow-Origin' => '*',
  117. 'Access-Control-Allow-Methods' => '*',
  118. 'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With',
  119. 'Access-Control-Expose-Headers' => 'Content-Disposition',
  120. 'Content-type' => 'application/octet-stream',
  121. 'Content-Disposition' => 'attachment; filename=' . $resource->name,
  122. ]);
  123. }
  124. return $this->errorFail();
  125. }
  126. }