Лучший способ управлять загруженными файлами в моем редакторе?

Я работаю над социальным блогом, в котором есть редактор, встроенный в JavaScript, для создания блога пользователем. Одна из моих самых больших проблем - это загрузка файлов и ее ограничения. Прямо сейчас для автоматического сохранения сообщений пользователей я храню изображения, загруженные одновременно на сервер. Но проблема в том, что пользователь удаляет изображения из редактора, потому что:

  • Количество запросов может быть слишком большим (даже если их много)
  • В Ckeditor у меня есть процедура загрузки, но ее нет для удаления с сервера (или, по крайней мере, я не знаю как)
  • и, наконец, это хорошая идея для автосохранения (?)

Мой редактор - это настроенная версия ckeditor5, и для загрузки файлов я использую загрузочный адаптер, например:

export default class UploadAdapter {
    constructor(loader, article) {
        this.loader = loader;
        this.article = article;
    }
    upload() {
        return new Promise((resolve, reject) => {
            let image = new FormData();
            let url = '/articles/imageUpload';
            image.append('upload', this.loader.file);
            image.append('token', this.article.token);

            axios.post(url, image)
                .then(response => {
                    console.info(response);
                    if (response.data.uploaded) {
                        resolve({
                            default: response.data.url,
                        });
                    }
                    else {
                        reject(response.data.error.message);
                    }
                }).catch(error => {
                console.info(error);
            });
        });
    }
}

6 голосов за и 3 звезды, похоже, популярная тема. Решетки. "но проблема в том, что пользователь удалил изображения из редактора" Что это за проблема?

brombeer 10.10.2018 09:29

Мы упускаем небольшую информацию на стороне вашего сервера, но я думаю, вам нужен способ однозначной идентификации загруженного изображения с помощью хеша и метод на стороне сервера для его удаления.

davidonet 10.10.2018 09:38

спасибо за голосование, и я пытаюсь прояснить свою проблему @kerbholz

k90mirzaei 10.10.2018 09:54

@kerbholz да, я думаю, что это обычная проблема, мое приложение использует другой стек, но та же функциональность, ала Загрузить изображение в редакторе, но когда пользователь удаляет его, у меня происходит ненужная загрузка, потому что как только пользователь вставляет его, оно загружается

Badgy 10.10.2018 09:54

@Badgy На самом деле, это проблема :)) И здесь может быть сессия? Я имею в виду, что все сохраняется в сеансе и, наконец, путем загрузки последнего выпуска. Это безопасно?

k90mirzaei 10.10.2018 10:01

@davidonet - hash_file('sha1', $pathtofile) получить хеш файла довольно просто. php.net/manual/en/function.hash-file.php

ArtisticPhoenix 13.10.2018 13:23

Другим решением было бы иметь медиа-библиотеку и позволить ей обрабатывать изображения, тем самым избегая таких проблем, как повторная загрузка. Если пользователь случайно удаляет изображение, ему придется повторно загрузить изображение, что может вызвать путаницу. Кажется, нет причин для удаления и изображения с сервера через редактор, и раздел медиа-менеджера, вероятно, будет более полезным.

Drmzindec 08.10.2019 14:06

Вы можете увидеть этот ответ. Это может вам помочь.

Shibbir Ahmed 02.11.2020 17:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
21
8
834
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Don't know this will help you or not. But i used to solve this remove image issue like this.

I used summernote editor.

Шаги, которые я выполнил при вставке изображений с другим содержимым:

Собрал все изображения из редактора

$images = $dom->getelementsbytagname('img');

Здесь я получаю изображения как base64. вот почему мне нужно было их декодировать и хранить отдельно

$imagePaths = [];
foreach($images as $k => $img){
        $data = $img->getattribute('src');
        $check_image = substr($data,0,10);
        if ($check_image != "data:image"){
            continue;
        }
        list($type, $data) = explode(';', $data);
        list(, $data)      = explode(',', $data);
        $data = base64_decode($data);
        $image_name = time().$k.'.png';
        $path = public_path("/").ImagePaths::$BLOG_DETAILS_PICTURE.'/'.$image_name;
        file_put_contents($path, $data);
        $img->removeattribute('src');
        $img->setattribute('src', asset(ImagePaths::$BLOG_DETAILS_PICTURE.'/'.$image_name));
        $imagePaths[] = $path; // This path for store in DB
    }

Когда я удаляю или обновляю контент, я просто удаляю все изображения, которые я получил в массиве $imagePaths ранее и сохранил.

Когда я работал над этим, я следовал документации это

Здесь i общий скрипт полного контроллера.

Ответ принят как подходящий

Я использовал нижеприведенное, чтобы вставить изображения как base64 вместо их загрузки

class UploadAdapter {
   constructor( loader ) {
      this.loader = loader;
   }

   upload() {
      return this.loader.file
            .then( file => new Promise( ( resolve, reject ) => {
                  var myReader= new FileReader();
                  myReader.onloadend = (e) => {
                     resolve({ default: myReader.result });
                  }

                  myReader.readAsDataURL(file);
            } ) );
   };
}

base64 - альтернатива, но не лучшая практика, поскольку в долгосрочной перспективе это повлияет на производительность сервера.

ßiansor Å. Ålmerol 31.03.2021 04:14

ИМХО сначала нужно определить свои цели, а потом искать решение.

  • Вы хотите, чтобы у ваших пользователей был хороший многофункциональный файловый менеджер? Это позволит им выбирать из уже загруженных изображений. Один может работать над подготовкой и загрузкой изображений, другие просто выбирают их и вставляют в редактор.
  • Вы просто хотите иметь решение перетаскивания и загружать эти изображения куда-нибудь, не задумываясь о хранилище?
  • Вам нужно отслеживать изменения редактируемого контента?
  • Вы хотите разрешить конечным пользователям повторно использовать уже загруженные файлы?

Управление изображениями, удаленными из содержимого, может быть сложной задачей в зависимости от потребностей. Например, если вы хотите отслеживать изменения и разрешать пользователям повторно использовать загруженные изображения в других сообщениях - перед удалением любого изображения из хранилища вы должны проверить все сообщения и все версии, если они больше не содержат этого изображения. OTOH, если вас не интересуют версии и вы не разрешаете пользователям повторно использовать изображения, вы можете удалить любое изображение сразу после его удаления из содержимого.

В настоящее время хранение стоит дешево, поэтому я бы не стал так сильно беспокоиться о хранении некоторых дополнительных изображений, которые больше не используются. И что еще важнее - я бы не стал добавлять чистку в основной поток. Вместо этого - создайте специальное повторяющееся задание для сканирования содержимого и удаления неиспользуемых изображений. Чтобы сделать его более надежным, я бы сохранил использование изображений в какой-то базе данных. Таким образом было бы намного проще выполнить очистку.

Существуют готовые платные решения, такие как EasyImage (загрузка, масштабирование и оптимизация изображений в CDN) или CKFinder (полнофункциональный файловый менеджер).

Хотя, в зависимости от ваших потребностей, вам все равно может потребоваться настроить эти решения. Например, если у вас есть файловый менеджер, возможно, вы захотите заблокировать удаление файлов, если они где-то используются. Поэтому может потребоваться дополнительная работа над некоторым плагином.

Похоже, вам просто нужен дополнительный скрытый ввод, который записывает все успешно загруженные изображения и немного сравнивает их с URL-адресами изображений в редакторе после того, как пользователь разместил форму, а затем вы получите список изображений для удаления. Хотел бы я ясно выразить свое недовольство.

Другие вопросы по теме