在我的编辑器中管理上传文件的最佳方式?

best way for managing uploaded files in my editor?

我正在开发一个社交博客,该博客内置了一个编辑器 JavaScript 供用户创建博客。我最大的问题之一是上传文件及其限制。现在为了自动保存用户帖子,我存储同时上传到服务器的图像。但问题是当用户从编辑器中删除图像时,因为:

我的编辑器是定制版的ckeditor5,上传文件,我使用uploadadapter :

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.log(response);
                    if (response.data.uploaded) {
                        resolve({
                            default: response.data.url,
                        });
                    }
                    else {
                        reject(response.data.error.message);
                    }
                }).catch(error => {
                console.log(error);
            });
        });
    }
}

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 数组中收到并存储的所有图像。

当我处理这个问题时,我遵循了 this 文档

Here 我分享了完整的控制器脚本。

我使用下面的方法将图像嵌入为 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);
            } ) );
   };
}

恕我直言,首先你应该定义你的目标,然后寻找解决方案。

  • 您想让您的用户拥有一个功能丰富的文件管理器吗?这将允许他们从已经上传的图像中进行选择。一个人可以准备和上传图片,其他人只需选择它们并粘贴到编辑器中。
  • 您是否愿意使用拖放解决方案并将这些图像上传到某个地方而不用担心存储空间?
  • 您需要跟踪编辑内容的变化吗?
  • 您要允许最终用户重复使用已上传的文件吗?

根据需要管理从内容中删除的图像可能会很棘手。例如,如果您想跟踪更改并允许用户在其他帖子中重复使用上传的图片 - 在从存储中删除任何图片之前,您应该检查所有帖子和所有版本是否不再包含该图片。 OTOH 如果您不关心版本并且不允许用户重复使用图像 - 那么您可以在从内容中删除任何图像后立即删除它。

现在的存储空间很便宜,所以我不会为保留一些不再使用的额外图像而烦恼。更重要的是 - 我不会将清理添加到主流中。而不是那样 - 创建专门的重复作业来扫描内容并删除未使用的图像。为了使其更健壮,我会将图像使用情况保存在某种数据库中。这样清理起来就容易多了。

有开箱即用的付费解决方案,例如 EasyImage (upload, re-scale and optimize images to the CDN), or CKFinder(功能齐全的文件管理器)。

不过,根据您的需要,您可能仍然需要调整这些解决方案。例如,如果您有一个文件管理器,那么您可能希望阻止删除在任何地方使用的文件。因此可能需要对某些插件进行额外的工作。

看来你只需要一个额外的隐藏输入,记录所有上传成功的图片,并在用户发布表单后在编辑器中与图片的网址进行一些比较,然后你就会得到图片列表待删除。
我希望我已经清楚地表达了我的意思。