Cos.php 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace App\Libraries\ChunkedUpload\Disks;
  3. use App\Libraries\ChunkedUpload\Contacts\ChunkedUploadContact;
  4. use App\Libraries\ChunkedUpload\Exceptions\UploadFailedException;
  5. use App\Services\File\Upload\ProgressBar;
  6. use Illuminate\Http\UploadedFile;
  7. use Illuminate\Support\Facades\Log;
  8. use Qcloud\Cos\Client;
  9. class Cos implements ChunkedUploadContact
  10. {
  11. public function upload(UploadedFile $file, string $savePath, string $name, ?ProgressBar $progressBar): string
  12. {
  13. $pathname = sprintf("%s/%s", $savePath, $name);
  14. $cosClient = new Client([
  15. 'region' => config('filesystems.disks.cos.region'),
  16. 'credentials' => [
  17. 'secretId' => config('filesystems.disks.cos.secret_id'),
  18. 'secretKey' => config('filesystems.disks.cos.secret_key')
  19. ]
  20. ]);
  21. try {
  22. $notUploadedSize = $file->getSize();
  23. $options = [
  24. 'PartSize' => 1 * 1024 * 1024,
  25. 'Progress' => function ($totalSize, $uploadedSize) use (&$notUploadedSize, $progressBar) {
  26. $partSize = $uploadedSize - ($totalSize - $notUploadedSize);
  27. $notUploadedSize = $totalSize - $uploadedSize;
  28. $progressBar?->increment($partSize);
  29. },
  30. 'ACL' => 'private',
  31. ];
  32. $cosClient->upload(
  33. sprintf("%s-%s", config('filesystems.disks.cos.bucket'), config('filesystems.disks.cos.app_id')),
  34. $pathname,
  35. fopen($file->getRealPath(), 'rb'),
  36. $options,
  37. );
  38. if ($notUploadedSize > 0) {
  39. $progressBar?->increment($notUploadedSize);
  40. }
  41. } catch (\Exception $exception) {
  42. Log::error($exception->getTraceAsString());
  43. throw new UploadFailedException("File upload failed.");
  44. }
  45. return $pathname;
  46. }
  47. }