瀏覽代碼

Add output image types for upload

Visman 2 年之前
父節點
當前提交
9d0ec76e8b

+ 12 - 6
app/Models/Attachment/Attachments.php

@@ -60,11 +60,10 @@ class Attachments extends Manager
         $p2 = (int) ($id / 1000);
         $p3 = \substr($name, 0, 235 - \strlen($ext)) . '_' . \sprintf("%03d", $id - $p2);
 
-        $path     = "{$p1}/{$p2}/{$p3}.{$ext}";
-        $location = $this->c->DIR_PUBLIC . self::FOLDER . $path;
+        $dir = $this->c->DIR_PUBLIC . self::FOLDER . "{$p1}/{$p2}";
 
         if (
-            ! \is_dir($dir = \implode('/', \explode('/', $location, -1)))
+            ! \is_dir($dir)
             && \mkdir($dir, 0755, true)
         ) {
             \file_put_contents("{$dir}/index.html", self::HTML_CONT);
@@ -75,12 +74,16 @@ class Attachments extends Manager
         if ($file instanceof Image) {
             $file->setQuality($this->c->config->i_upload_img_quality ?? 75)
                 ->resize($this->c->config->i_upload_img_axis_limit, $this->c->config->i_upload_img_axis_limit);
+
+            if (! empty($this->c->config->s_upload_img_outf)) {
+                $ext = '(' . \strtr($this->c->config->s_upload_img_outf, [',' => '|']) . ')';
+            }
         }
 
-        $status = $file->toFile($location);
+        $status = $file->toFile("{$dir}/{$p3}.{$ext}");
 
         if (true !== $status) {
-            $this->c->Log->warning("Attachments Failed processing {$path}", [
+            $this->c->Log->warning("Attachments Failed processing {$p1}/{$p2}/{$p3}.{$ext}", [
                 'user'    => $this->user->fLog(),
                 'error'   => $file->error(),
             ]);
@@ -95,7 +98,10 @@ class Attachments extends Manager
             return null;
         }
 
-        $size = $this->c->Files->size(\filesize($location), 'K');
+        $location = $file->path();
+        $path     = "{$p1}/{$p2}/{$file->name()}.{$file->ext()}";
+        $size     = $this->c->Files->size(\filesize($location), 'K');
+
         $vars = [
             ':id'      => $id,
             ':path'    => $path,

+ 1 - 0
app/Models/Pages/Admin/Install.php

@@ -1575,6 +1575,7 @@ class Install extends Admin
             'b_upload'                => 0,
             'i_upload_img_quality'    => 75,
             'i_upload_img_axis_limit' => 1920,
+            's_upload_img_outf'       => 'webp,jpg,png,gif',
         ];
 
         foreach ($forkConfig as $name => $value) {

+ 6 - 0
app/Models/Pages/Admin/Update.php

@@ -721,6 +721,12 @@ class Update extends Admin
      */
     protected function stageNumber60(array $args): ?int
     {
+        $config = $this->c->config;
+
+        $config->s_upload_img_outf = 'webp,jpg,png,gif';
+
+        $config->save();
+
         $this->c->DB->addField('::users', 'u_up_size_mb', 'INT(10) UNSIGNED', false, 0);
 
         return null;

+ 47 - 0
app/Models/Pages/Admin/Uploads.php

@@ -32,9 +32,11 @@ class Uploads extends Admin
         if ('POST' === $method) {
             $v = $this->c->Validator->reset()
                 ->addValidators([
+                    'ext_check' => [$this, 'vExtsCheck'],
                 ])->addRules([
                     'token'                   => 'token:AdminUploads',
                     'b_upload'                => 'required|integer|in:0,1',
+                    's_upload_img_outf'       => 'required|string:trim|max:255|ext_check',
                     'i_upload_img_quality'    => 'required|integer|min:0|max:100',
                     'i_upload_img_axis_limit' => 'required|integer|min:100|max:20000',
                 ])->addAliases([
@@ -44,6 +46,7 @@ class Uploads extends Admin
 
             if ($v->validation($_POST)) {
                 $this->c->config->b_upload                = $v->b_upload;
+                $this->c->config->s_upload_img_outf       = $v->s_upload_img_outf;
                 $this->c->config->i_upload_img_quality    = $v->i_upload_img_quality;
                 $this->c->config->i_upload_img_axis_limit = $v->i_upload_img_axis_limit;
                 $this->c->config->save();
@@ -82,6 +85,14 @@ class Uploads extends Admin
                             'caption' => 'Uploads mode label',
                             'help'    => ['Uploads mode help', __('User groups'), $this->c->Router->link('AdminGroups')],
                         ],
+                        's_upload_img_outf' => [
+                            'required'  => true,
+                            'type'      => 'text',
+                            'maxlength' => '255',
+                            'value'     => $config->s_upload_img_outf,
+                            'caption'   => 'Output image types label',
+                            'help'      => 'Output image types help',
+                        ],
                         'i_upload_img_quality' => [
                             'type'    => 'number',
                             'min'     => '0',
@@ -109,4 +120,40 @@ class Uploads extends Admin
             ],
         ];
     }
+
+    /**
+     * Наводит порядок в расширениях
+     */
+    public function vExtsCheck(Validator $v, string $exts): string
+    {
+        $allowed = [
+            'webp' => true,
+            'jpg'  => true,
+            'jpeg' => 'jpg',
+            'png'  => true,
+            'gif'  => true,
+            'avif' => true,
+        ];
+
+        $exts   = \explode(',', \mb_strtolower($exts, 'UTF-8'));
+        $result = [];
+
+        foreach ($exts as $ext) {
+            $ext = \trim($ext);
+
+            if (isset($allowed[$ext])) {
+                if (\is_string($allowed[$ext])) {
+                    $ext = $allowed[$ext];
+                }
+
+                $result[$ext] = $ext;
+            }
+        }
+
+        if (empty($result)) {
+            return 'webp';
+        } else {
+            return \implode(',', $result);
+        }
+    }
 }

+ 6 - 0
app/lang/en/admin_uploads.po

@@ -32,3 +32,9 @@ msgstr "Axis limit"
 
 msgid "Upload axis limit help"
 msgstr "The uploaded image will be resized if its width/height is greater than this limit."
+
+msgid "Output image types label"
+msgstr "Output image types"
+
+msgid "Output image types help"
+msgstr "Types of pictures to save to this site, separated by commas. If a picture of another type is loaded, it will be converted to the first type from this list."

+ 6 - 0
app/lang/ru/admin_uploads.po

@@ -32,3 +32,9 @@ msgstr "Ограничение по оси"
 
 msgid "Upload axis limit help"
 msgstr "К загруженному изображению будет применен ресайз, если его ширина/высота больше этого ограничения."
+
+msgid "Output image types label"
+msgstr "Вых. типы картинок"
+
+msgid "Output image types help"
+msgstr "Типы картинок для сохранения на этот сайт, через запятую. Если загружена картинка другого типа, то она будет конвертирована в первый тип из этого списка."