<?php namespace App\Helpers; use Illuminate\Support\Facades\Storage; use Illuminate\Http\Response; use Illuminate\Http\RedirectResponse; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Symfony\Component\HttpFoundation\StreamedResponse; use Illuminate\Contracts\Filesystem\FileNotFoundException; class StorageHelper { public static function downloader($filename, $disk = 'default') : BinaryFileResponse | RedirectResponse | StreamedResponse { if ($disk == 'default') { $disk = config('filesystems.default'); } switch (config("filesystems.disks.$disk.driver")) { case 'local': return response()->download(Storage::disk($disk)->path($filename)); //works for PRIVATE or public?! case 's3': return redirect()->away(Storage::disk($disk)->temporaryUrl($filename, now()->addMinutes(5))); //works for private or public, I guess? default: return Storage::disk($disk)->download($filename); } } /** * This determines the file types that should be allowed inline and checks their fileinfo extension * to determine that they are safe to display inline. * * @author <A. Gianotto> [<snipe@snipe.net]> * @since v7.0.14 * @param $file_with_path * @return bool */ public static function allowSafeInline($file_with_path) { $allowed_inline = [ 'pdf', 'svg', 'jpg', 'gif', 'svg', 'avif', 'webp', 'png', ]; // The file exists and is allowed to be displayed inline if (Storage::exists($file_with_path) && (in_array(pathinfo($file_with_path, PATHINFO_EXTENSION), $allowed_inline))) { return true; } return false; } /** * Decide whether to show the file inline or download it. */ public static function showOrDownloadFile($file, $filename) { $headers = []; if (request('inline') == 'true') { $headers = [ 'Content-Disposition' => 'inline', ]; // This is NOT allowed as inline - force it to be displayed as text in the browser if (self::allowSafeInline($file) != true) { $headers = array_merge($headers, ['Content-Type' => 'text/plain']); } } // Everything else seems okay, but the file doesn't exist on the server. if (Storage::missing($file)) { throw new FileNotFoundException(); } return Storage::download($file, $filename, $headers); } }