ReceiveFile.php 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <?php
  2. namespace Illuminate\Filesystem;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Http\Response;
  5. use Illuminate\Support\Facades\Storage;
  6. use League\Flysystem\PathTraversalDetected;
  7. class ReceiveFile
  8. {
  9. /**
  10. * Create a new invokable controller to receive files.
  11. */
  12. public function __construct(
  13. protected string $disk,
  14. protected array $config,
  15. protected bool $isProduction,
  16. ) {
  17. //
  18. }
  19. /**
  20. * Handle the incoming request.
  21. */
  22. public function __invoke(Request $request, string $path): Response
  23. {
  24. abort_unless(
  25. $this->hasValidSignature($request),
  26. $this->isProduction ? 404 : 403
  27. );
  28. try {
  29. Storage::disk($this->disk)->put($path, $request->getContent());
  30. return response()->noContent();
  31. } catch (PathTraversalDetected $e) {
  32. abort(404);
  33. }
  34. }
  35. /**
  36. * Determine if the request has a valid signature if applicable.
  37. */
  38. protected function hasValidSignature(Request $request): bool
  39. {
  40. return $request->boolean('upload') && $request->hasValidRelativeSignature();
  41. }
  42. }