Я работаю над социальным блогом, в котором есть редактор, встроенный в JavaScript, для создания блога пользователем. Одна из моих самых больших проблем - это загрузка файлов и ее ограничения. Прямо сейчас для автоматического сохранения сообщений пользователей я храню изображения, загруженные одновременно на сервер. Но проблема в том, что пользователь удаляет изображения из редактора, потому что:
Мой редактор - это настроенная версия 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);
});
});
}
}
Мы упускаем небольшую информацию на стороне вашего сервера, но я думаю, вам нужен способ однозначной идентификации загруженного изображения с помощью хеша и метод на стороне сервера для его удаления.
спасибо за голосование, и я пытаюсь прояснить свою проблему @kerbholz
@kerbholz да, я думаю, что это обычная проблема, мое приложение использует другой стек, но та же функциональность, ала Загрузить изображение в редакторе, но когда пользователь удаляет его, у меня происходит ненужная загрузка, потому что как только пользователь вставляет его, оно загружается
@Badgy На самом деле, это проблема :)) И здесь может быть сессия? Я имею в виду, что все сохраняется в сеансе и, наконец, путем загрузки последнего выпуска. Это безопасно?
@davidonet - hash_file('sha1', $pathtofile) получить хеш файла довольно просто. php.net/manual/en/function.hash-file.php
Другим решением было бы иметь медиа-библиотеку и позволить ей обрабатывать изображения, тем самым избегая таких проблем, как повторная загрузка. Если пользователь случайно удаляет изображение, ему придется повторно загрузить изображение, что может вызвать путаницу. Кажется, нет причин для удаления и изображения с сервера через редактор, и раздел медиа-менеджера, вероятно, будет более полезным.
Вы можете увидеть этот ответ. Это может вам помочь.






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 - альтернатива, но не лучшая практика, поскольку в долгосрочной перспективе это повлияет на производительность сервера.
ИМХО сначала нужно определить свои цели, а потом искать решение.
Управление изображениями, удаленными из содержимого, может быть сложной задачей в зависимости от потребностей. Например, если вы хотите отслеживать изменения и разрешать пользователям повторно использовать загруженные изображения в других сообщениях - перед удалением любого изображения из хранилища вы должны проверить все сообщения и все версии, если они больше не содержат этого изображения. OTOH, если вас не интересуют версии и вы не разрешаете пользователям повторно использовать изображения, вы можете удалить любое изображение сразу после его удаления из содержимого.
В настоящее время хранение стоит дешево, поэтому я бы не стал так сильно беспокоиться о хранении некоторых дополнительных изображений, которые больше не используются. И что еще важнее - я бы не стал добавлять чистку в основной поток. Вместо этого - создайте специальное повторяющееся задание для сканирования содержимого и удаления неиспользуемых изображений. Чтобы сделать его более надежным, я бы сохранил использование изображений в какой-то базе данных. Таким образом было бы намного проще выполнить очистку.
Существуют готовые платные решения, такие как EasyImage (загрузка, масштабирование и оптимизация изображений в CDN) или CKFinder (полнофункциональный файловый менеджер).
Хотя, в зависимости от ваших потребностей, вам все равно может потребоваться настроить эти решения. Например, если у вас есть файловый менеджер, возможно, вы захотите заблокировать удаление файлов, если они где-то используются. Поэтому может потребоваться дополнительная работа над некоторым плагином.
Похоже, вам просто нужен дополнительный скрытый ввод, который записывает все успешно загруженные изображения и немного сравнивает их с URL-адресами изображений в редакторе после того, как пользователь разместил форму, а затем вы получите список изображений для удаления. Хотел бы я ясно выразить свое недовольство.
6 голосов за и 3 звезды, похоже, популярная тема. Решетки. "но проблема в том, что пользователь удалил изображения из редактора" Что это за проблема?