Bläddra i källkod

Replace base64 images in messages to uploaded files

For users who have permission to upload files.
Visman 1 år sedan
förälder
incheckning
5ac2b20ff2
1 ändrade filer med 52 tillägg och 26 borttagningar
  1. 52 26
      app/Models/Pages/PostValidatorTrait.php

+ 52 - 26
app/Models/Pages/PostValidatorTrait.php

@@ -10,6 +10,7 @@ declare(strict_types=1);
 
 namespace ForkBB\Models\Pages;
 
+use ForkBB\Core\Image;
 use ForkBB\Core\Validator;
 use ForkBB\Models\Model;
 use function \ForkBB\__;
@@ -103,10 +104,7 @@ trait PostValidatorTrait
     {
         $this->c->Lang->load('validator');
 
-        // обработка вложений + хак с добавление вложений в сообщение на лету
-        if (\is_string($attMessage = $this->attachmentsProc($marker, $args))) {
-            $_POST['message'] .= $attMessage;
-        }
+        $this->attachmentsProc($marker, $args);
 
         $notPM = $this->fIndex !== self::FI_PM;
 
@@ -297,55 +295,83 @@ trait PostValidatorTrait
     /**
      * Обрабатывает загруженные файлы
      */
-    protected function attachmentsProc(string $marker, array $args): ?string
+    protected function attachmentsProc(string $marker, array $args): void
     {
         if (! $this->userRules->useUpload) {
-            return null;
+            return;
         }
 
         $v = $this->c->Validator->reset()
             ->addValidators([
-                'check_attach'   => [$this, 'vCheckAttach'],
+                'check_attach' => [$this, 'vCheckAttach'],
             ])->addRules([
-                'token'        => 'token:' . $marker,
-                'attachments'  => "file:multiple|max:{$this->user->g_up_size_kb}|check_attach",
+                'token'       => 'token:' . $marker,
+                'message'     => 'string:trim',
+                'attachments' => "file:multiple|max:{$this->user->g_up_size_kb}|check_attach",
             ])->addAliases([
-                'attachments'  => 'Attachments',
+                'attachments' => 'Attachments',
             ])->addArguments([
-                'token'        => $args,
+                'token' => $args,
             ])->addMessages([
             ]);
 
         if (! $v->validation($_FILES + $_POST)) {
             $this->fIswev = $v->getErrors();
 
-            return null;
-        } elseif (! \is_array($v->attachments)) {
-            return null;
+            return;
         }
 
-        $result = "\n";
-        $calc   = false;
+        $calc = false;
 
-        foreach ($v->attachments as $file) {
-            $data = $this->c->attachments->addFile($file);
+        // костыль с конвертацией картинок из base64 в файлы
+        $_POST['message'] = \preg_replace_callback(
+            '%\[img\](data:[\w/.+-]*+;base64,[a-zA-Z0-9/+=]++)\[/img\]%',
+            function ($matches) use ($calc) {
+                $file = $this->c->Files->uploadFromLink($matches[1]);
 
-            if (\is_array($data)) {
-                $name = $file->name();
-                $calc = true;
+                if (! $file instanceof Image) {
+                    return $this->c->Files->error() ?? 'Bad image';
+                }
+
+                $data = $this->c->attachments->addFile($file);
 
-                if ($data['image']) {
-                    $result .= "[img]{$data['url']}[/img]\n"; // ={$name}
+                if (\is_array($data)) {
+                    $calc = true;
+
+                    return "[img]{$data['url']}[/img]";
                 } else {
-                    $result .= "[url={$data['url']}]{$name}[/url]\n";
+                    return 'Bad file';
+                }
+            },
+            (string) $v->message
+        );
+
+        if (\is_array($v->attachments)) {
+            $result = '';
+
+            foreach ($v->attachments as $file) {
+                $data = $this->c->attachments->addFile($file);
+
+                if (\is_array($data)) {
+                    $name = $file->name();
+                    $calc = true;
+
+                    if ($data['image']) {
+                        $result .= "\n[img]{$data['url']}[/img]"; // ={$name}
+                    } else {
+                        $result .= "\n[url={$data['url']}]{$name}[/url]";
+                    }
                 }
             }
+
+            // костыль с добавление вложений в сообщение на лету
+            if ('' !== $result) {
+                $_POST['message'] .= $result;
+            }
         }
 
         if ($calc) {
             $this->c->attachments->recalculate($this->user);
         }
-
-        return $result;
     }
 }