FileController.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\API\File\DownloadRequest;
  5. use App\Http\Requests\API\File\FileUploadRequest;
  6. use App\Http\Requests\API\File\UploadRequest;
  7. use App\Http\Resources\API\FileByObjectResource;
  8. use App\Http\Resources\API\FileUploadSuccessResource;
  9. use App\Models\Enums\FileObjectType;
  10. use App\Models\File;
  11. use Carbon\Carbon;
  12. use Illuminate\Support\Facades\Auth;
  13. use Illuminate\Support\Facades\Storage;
  14. use Illuminate\Support\Str;
  15. class FileController extends Controller
  16. {
  17. public function upload(UploadRequest $request)
  18. {
  19. $file = $request->file('file');
  20. $ext = $request->file('file')->getClientOriginalExtension() ? '.'.$request->file('file')->getClientOriginalExtension() : null;
  21. $fileName = $request->fileName ? $request->fileName : Carbon::now()->timestamp. '_' . Str::random(10).$ext;
  22. $path = 'uploads/' .date('Ymd/').$fileName;
  23. Storage::put($path, file_get_contents($file->getRealPath()));
  24. return [
  25. 'fileName' => $fileName,
  26. 'url' => $path,
  27. 'fullUrl' => Storage::url($path),
  28. 'ext' => $ext,
  29. ];
  30. }
  31. public function download(DownloadRequest $request)
  32. {
  33. $url=$request->url;
  34. return Storage::download($url);
  35. }
  36. /**
  37. * 文件上传
  38. *
  39. * @param FileUploadRequest $request
  40. * @return \Illuminate\Http\JsonResponse
  41. */
  42. public function uploads(FileUploadRequest $request)
  43. {
  44. $names = $request->get("file_names", []);
  45. $fileObjectType = FileObjectType::from($request->object_type);
  46. foreach ($request->file("files") as $file) {
  47. if (! $file->isValid()) {
  48. return $this->badRequest("File upload failed.");
  49. }
  50. }
  51. $items = [];
  52. foreach ($request->file("files") as $index => $file) {
  53. $pathname = $file->storeAs(
  54. sprintf("c%s/%s/%s", Auth::user()->company_id, $fileObjectType->value, date("Ymd")),
  55. sprintf("%s.%s", md5(uniqid()), $file->extension()),
  56. );
  57. if (! $pathname) {
  58. return $this->badRequest("File upload failed.");
  59. }
  60. $items[] = [
  61. 'pathname' => $pathname,
  62. 'title' => $names[$index] ?? $file->getClientOriginalName(),
  63. 'size' => $file->getSize(),
  64. 'extension' => $file->extension(),
  65. 'object_type' => $request->object_type,
  66. 'object_id' => $request->object_id,
  67. 'created_by' => Auth::id(),
  68. 'company_id' => Auth::user()->company_id,
  69. ];
  70. }
  71. $uploadedFiles = [];
  72. foreach ($items as $item) {
  73. if ($item['object_id']) {
  74. $version = File::query()
  75. ->where('object_type', $item['object_type'])
  76. ->where('object_id', $item['object_id'])
  77. ->where("title", $item['title'])
  78. ->count();
  79. $item['version'] = $version + 1;
  80. }
  81. $file = File::query()->create($item);
  82. $uploadedFiles[] = new FileUploadSuccessResource($file);
  83. }
  84. return $this->success([
  85. 'data' => $uploadedFiles
  86. ]);
  87. }
  88. public function byObject(string $objectType, string $objectId)
  89. {
  90. $fileObjectType = FileObjectType::from($objectType);
  91. $fileObjectType->modelBuilderAllowed($objectId)->findOrFail($objectId);
  92. $files = File::query()
  93. ->with(['createdBy'])
  94. ->where('object_type', $objectType)
  95. ->where('object_id', $objectId)
  96. ->orderByDesc("version")
  97. ->get();
  98. $items = [];
  99. foreach ($files->groupBy("title") as $fileItems) {
  100. $item = (new FileByObjectResource($fileItems->first()))->toArray(request());
  101. $item['children'] = [];
  102. foreach ($fileItems as $fileItem) {
  103. $item['children'][] = new FileByObjectResource($fileItem);
  104. }
  105. $items[] = $item;
  106. }
  107. return $this->success([
  108. 'data' => $items
  109. ]);
  110. }
  111. }