]> _ Git - cubist_cms-back.git/commitdiff
wip #6135 @1
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 17 Jul 2023 16:21:08 +0000 (18:21 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Mon, 17 Jul 2023 16:21:08 +0000 (18:21 +0200)
src/app/Http/Controllers/CubistFilesorURLUpload.php
src/app/Magic/Models/CubistMagicAbstractModel.php
src/resources/views/fields/filesorurl.blade.php

index ee83a527d0ee48b2a8a8c82da9763b072577bc59..cb433fe58fb00f62e64ad5d0aae6c2b94f0934eb 100644 (file)
@@ -3,6 +3,8 @@
 namespace Cubist\Backpack\Http\Controllers;
 
 use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+use Cubist\Util\Files\Files;
+use Cubist\Util\Zip;
 use Illuminate\Http\UploadedFile;
 
 class CubistFilesorURLUpload
@@ -16,15 +18,36 @@ class CubistFilesorURLUpload
         /** @var CubistMagicAbstractModel $instance */
         $instance = $className::find($id);
 
-        foreach (request()->allFiles() as $files) {
-            if (!is_array($files)) {
-                $files = [$files];
+        if (isset($_FILES['directory'])) {
+            $temp = Files::tmpdir();
+            foreach ($_FILES['directory']['full_path'] as $index => $path) {
+                $path = $this->_removeBasePath($path, $basePath);
+                $dest = $temp . '/' . Files::tidyName($path);
+                Files::mkdir(dirname($dest));
+                move_uploaded_file($_FILES['directory']['tmp_name'][$index], $dest);
             }
-            foreach ($files as $file) {
-                /** @var $file UploadedFile */
-                $res[] = $instance->uploadFreeFile($file, $attribute);
+            $tmpZip = Files::tmpdir() . '/' . $basePath . '.zip';
+            Zip::archive($temp, $tmpZip);
+            Files::rmdir($temp);
+            $res[] = $instance->uploadFreeFile(new \SplFileInfo($tmpZip), $attribute);
+        } else {
+            foreach (request()->allFiles() as $files) {
+                if (!is_array($files)) {
+                    $files = [$files];
+                }
+                foreach ($files as $file) {
+                    /** @var $file UploadedFile */
+                    $res[] = $instance->uploadFreeFile($file, $attribute);
+                }
             }
         }
         return response()->json($res);
     }
+
+    protected function _removeBasePath($path, &$basePath)
+    {
+        $e = explode('/', trim($path, '/'));
+        $basePath = array_shift($e);
+        return implode('/', $e);
+    }
 }
index 350ad039c14d888577dcf0c1b7e93ec91906e5a1..db868481c30471be0e04c3e687ee7407e741f3e9 100644 (file)
@@ -1190,7 +1190,7 @@ class CubistMagicAbstractModel extends Model implements HasMedia
     }
 
     /**
-     * @param $uploadedFile UploadedFile
+     * @param $uploadedFile UploadedFile|\SplFileInfo
      * @param $attribute string
      * @return string
      * @throws \Exception
@@ -1206,16 +1206,21 @@ class CubistMagicAbstractModel extends Model implements HasMedia
             throw new \Exception('Base directory must be set');
         }
         $dir = \Cubist\Util\Files\Files::mkdir($baseDirectory . '/' . $field->getAttribute('destination', ''));
-        $name = $uploadedFile->getClientOriginalName();
-        $e = explode('.', $name);
-        $ext = array_pop($e);
-        $name = implode('.', $e);
-        $name = Str::slugCase($name) . '.' . $ext;
+        if ($uploadedFile instanceof UploadedFile) {
+            $name = $uploadedFile->getClientOriginalName();
+        } else {
+            $name = $uploadedFile->getFilename();
+        }
+        $name = \Cubist\Util\Files\Files::tidyName($name);
         $dest = $dir . $name;
         if (file_exists($dest)) {
             unlink($dest);
         }
-        move_uploaded_file($uploadedFile->getPathname(), $dest);
+        if ($uploadedFile instanceof UploadedFile) {
+            move_uploaded_file($uploadedFile->getPathname(), $dest);
+        } else {
+            rename($uploadedFile->getPathname(), $dest);
+        }
         return $name;
     }
 
index c73a65f97aad63d680ded782368c47b405eebb52..aa116cb8a78cf1f373c342e1f58b9128f89411b8 100644 (file)
                accept="{{$field['accept']}}"
            @endif
            class="freefile-file-input" form="{{$form_id}}">
+    @if(isset($field['accept']) && $field['accept'] && stristr($field['accept'],'.zip'))
+        <input type="file" multiple directory webkitdirectory name="directory[]" class="freefile-file-input-directory"
+               form="{{$form_id}}">
+        <a class="upload" href="#" data-tooltip="{{__('Clic pour charger un ou plusieurs fichiers, Cltr+Clic pour charger un dossier')}}"></a>
+    @endif
+
     <input type="text" name="{{ $field['name'] }}"
            value="{{ old(square_brackets_to_dots($field['name'])) ?? $field['value'] ?? $field['default'] ?? '' }}"
         @include('crud::fields.inc.attributes', ['default_class' =>  'form-control freefile-text-input'])
     @endpush
 
     @push('crud_fields_scripts')
-        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js" integrity="sha512-YUkaLm+KJ5lQXDBdqBqk7EVhJAdxRnVdT2vtCzwPHSweCzyMgYV/tgGF4/dCyqtCC2eCphz0lRQgatGVdfR0ww==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js"
+                integrity="sha512-YUkaLm+KJ5lQXDBdqBqk7EVhJAdxRnVdT2vtCzwPHSweCzyMgYV/tgGF4/dCyqtCC2eCphz0lRQgatGVdfR0ww=="
+                crossorigin="anonymous" referrerpolicy="no-referrer"></script>
         <script>
             jQuery(document).ready(function ($) {
-
                 $(document).on('change', '.freefile-file-input', function () {
                     var parent = $(this).closest('.freefile-file');
                     $(parent).addClass('loading');