使用 Livewire 和 Filepond 编辑模型时处理预先存在的图像

2024-03-13

我有一个 Filepond 组件,非常适合将图像上传到帖子。

然而,当我需要编辑帖子及其预先存在的图像时,我正在与 Filepond 作斗争。

我想用 Post 模型预先存在的图像加载 Filepond。目标是允许用户在编辑 Post 模型时上传、删除和重新排序图像,然后更新数据库和文件系统。

这是我到目前为止所拥有的:

<div
        x-data=""
        x-init="
            // Plugins
            FilePond.registerPlugin(FilePondPluginImagePreview);
            FilePond.registerPlugin(FilePondPluginImageExifOrientation);
            FilePond.registerPlugin(FilePondPluginFileValidateType);
            FilePond.registerPlugin(FilePondPluginFileValidateSize);
            FilePond.registerPlugin(FilePondPluginImageResize);

            // Set options
            FilePond.setOptions({
                allowMultiple: true,
                allowReorder: true,
                itemInsertLocation: 'after',
                server: {
                    process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
                        @this.upload('images', file, load, error, progress)
                    },
                    revert: (filename, load) => {
                        @this.removeUpload('images', filename, load)
                    },
                },
                // This allows me to reorder the images, essential resetting the $image variable in livewire component when ever th euser reorders the images in filepond
                onreorderfiles(files, origin, target){
                    @this.set('images', null);
                    files.forEach(function(file) {
                        @this.upload('images', file.file);
                    });
                },

            });

            // Create Filepond
            const pond = FilePond.create($refs.input, {
                acceptedFileTypes: ['image/png', 'image/jpeg'],
                
                @if(optional($post)->images) // If we are editing a post and if that post has images
                files: [
                    @foreach($post->images as $image)// Loop through each image for the post
                        {
                            // the server file reference
                            source: '{{ Storage::disk('post_images')->url($post->id . '/' . $image->filename.$image->extension) }}', 
                        },
                    @endforeach
                ],
                @endif
            });

            pond.on('addfile', (error, file) => {
                if (error) {
                    console.log('Oh no');
                    return;
                }
            });
        "
    >
        <div wire:ignore wire:key="images">
                <input
                    id="image-upload"
                    type="file"
                    x-ref="input"
                    multiple
                >

                @error('images.*')
                <p wire:key="error_images" class="mt-2 text-sm text-red-600" id="email-error">{{ $message }}</p>
                @enderror
        </div>
    </div>

然而,这会导致每次用户查看编辑页面时所有图像都会重新上传。

网上有很多关于如何使用 Filepond 和 Livewire 上传图像的信息,但关于如何编辑的信息却很少。

除了每次用户查看编辑页面时重新上传之外,是否有更好的方法来管理图像?


我能够处理模型上预先存在的图像,特别是我能够重新排序图像.

为了处理图像的重新排序,我们需要来自服务器和 Livewire 的唯一标识符上传方式 https://laravel-livewire.com/docs/2.x/file-uploads#js-api它被神奇地为我们处理了。

@this.upload('images', file, load, error, progress)

这很棒,并且可以处理或恢复上传,但是当我们尝试监听 filepond 时会中断onreorderfile事件。 Filepond 知道如何在 DOM 级别处理重新排序,但缺少一个重要信息,即来自服务器的唯一标识符

onreorderfiles(files, origin, target) {
    console.log(file.serverId); // this will be null
}

这是为什么?我们第一次通过文件池添加图像文件数组 https://pqina.nl/filepond/docs/api/instance/properties/#files or 添加文件方法 https://pqina.nl/filepond/docs/api/instance/methods/#adding-files我们使用 Livewire 处理图像@this.upload('images', file, load, error, progress)。这里的加载回调返回的是serverId或者我们需要的唯一标识符,以便 Filepond 可以与后端进行通信。来自 filepond 的加载回调可在服务器进程对象 https://pqina.nl/filepond/docs/api/server/#process但不在onreorderfiles event.

这不太正确,但我们确实知道在哪里可以找到 serverId。深入了解 Livewire 的源代码livewire\livewire\js\UploadManager.js我们会找到 upload 方法,它确实返回 tmpFilename:

this.component.on('upload:finished', (name, tmpFilenames) => this.markUploadFinished(name, tmpFilenames))

问题很明显,因为 onreorderfiles 事件我们没有指定对 filepond 的 load() 方法的任何回调,并且当脚本到达服务器进程对象时load未定义:

onreorderfiles(files, origin, target){
    // omitted code

    @this.upload('images', file.file);

    // omitted code
}

Summary

解决方案是无论如何显式返回成功回调。

更改以下代码块:

server: {
    process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
        @this.upload('images', file, load, error, progress)
},

为此,请记住,livewire 上传方法无论如何都会返回唯一的文件名,但我们需要将其传递给 filepond,并且 load 方法接受响应作​​为参数:

server: {
    process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
        @this.upload('images', file,
            // this is the secret method people have been looking for
            (uploadedFilename) => {
                load(uploadedFilename);
            }, error, progress)
},

嗯,这不是秘密per se因为它记录在 Livewire文件上传 https://laravel-livewire.com/docs/2.x/file-uploads#js-api.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Livewire 和 Filepond 编辑模型时处理预先存在的图像 的相关文章

随机推荐

  • React - 将所有数据从 json 加载到组件中

    我正在使用 React 并尝试将数据从本地 json 文件加载到我的组件中 我试图打印所有信息 包括名称 值对中的 名称 不仅仅是值 使其看起来像一个表单 我正在寻找最好的方法来做到这一点 我需要解析吗 我需要使用地图功能吗 我是 Reac
  • 在 PHP 中获取数组的最后一个元素而不更改数组? [复制]

    这个问题在这里已经有答案了 array pop 将其从数组中删除 end 改变内部指针 唯一的方法真的像这样 my array array pop array keys my array 这有效 list end array slice a
  • 如何检查 window.external 上是否存在函数

    如何检查 window external 上是否存在函数 我正在从 javascript 调用 C 代码 并且想检查 C 对象中是否存在方法 我找到了路 只需使用 in 运算符 如下所示 if FunctionName in window
  • 元组的串联

    普通文本 我在 python 3 2 1 上编码时遇到一些问题 实际上我正在参加有关 python 2 5 的在线讲座 这是代码 x 100 divisors for i in range 1 x if x i 0 divisors div
  • 在 bash shell 中打印星号(“*”)

    a 5 echo aMin bash etc init d ckDskCheck sh 当我尝试运行以下代码时 它会正确显示 5 bash etc init d ckDskCheck sh 但是 当我尝试使用以下代码将结果分配给变量并将其打
  • 快速使用未解析的标识符“UIApplicationStateInactive”

    在我处理推送通知的 Swift 代码中 我有这一行 if application applicationState UIApplicationStateInactive application applicationState UIAppl
  • 如何在sqlite android中插入多行

    我有一种方法可以将值插入到sqlite在一个班级里 在主要活动中 我正在解析 json 值并尝试将这些值插入到sqlite在循环中 因为我必须插入不止一行 但只有一行被添加到数据库中 添加多行的方法如下 public void addSes
  • 如何访问SetDefaultContentHeaders中的底层对象?

    我有一个 Web api 我在其中返回一个对象 当我使用接受标头 image jpg 时 我想要该对象的图像表示形式 但我想根据我返回的对象设置文件名 我已经实施了一个BufferedMediaTypeFormatter并认为我应该在方法中
  • 如何在 Windows 中使用本地路径访问 Subversion 存储库?

    我安装了 CollabNet Subversion 服务器和客户端 运行附带的 Apache 从服务器上的命令行 我可以使用类似的路径轻松访问存储库 http server port svn repository 但我无法使用它在磁盘上的实
  • 类似 git 界面的最佳方法

    我正在编写一个小型命令行待办事项应用程序 它具有类似于 git 的通用界面 它可以执行多项任务 add list complete 所有这些都应该可以通过todo
  • docker容器主机名顺序号

    在 docker swarm 中存在副本 规模的情况下 是否有任何选项可以让主机名 容器名具有一些序列号 version 3 services serA image someimage1 hostname serA serB image s
  • 在 C# 中将字符串存储为 UTF8

    我在 C 中进行了大量的字符串操作 并且确实需要将字符串每个字符存储一个字节 这是因为我需要在内存中同时存储千兆字节的文本 这会导致内存不足的问题 我确信该文本永远不会包含非 ASCII 字符 因此就我的目的而言 System String
  • 一个类可以从类本身内部取消吗?

    例如 此代码有效吗 class abc int x y abc int x int y this x x this y y while true update public void update x y if y 0 this null
  • Python的seek函数是如何工作的?

    如果我有一些类似文件的对象并执行以下操作 F open abc r loc F tell F seek loc 10 寻求有什么作用 是从文件开头开始读取loc 10字节 或者它是否足够聪明 只备份 10 个字节 它是特定于操作系统和 li
  • 用 AJAX 调用替换多少内容就太多了?

    我在尝试进行 AJAX 开发时遇到了一个常见问题 在可能的情况下 我喜欢尝试只更新现有布局中的数据 而不是布局本身 例如 采用下面的 div div Here is some content div 我会得到更新的值content 5从服务
  • 使用“read”读取密码时如何回显星号(*)?

    如果我想回显 我需要对 Bash 中的代码做什么 当用户在 using 中键入某些内容时 用 s 代替密码字符 甚至完全隐藏这些字符 read As 马克 鲁沙科夫指出 read s将抑制在提示符下键入的字符的回显 您可以利用该功能作为此脚
  • jqGrid如何使用EditUrl

    我正在使用 jqGrid 使用 jSON 数据维护 MySQL 中的数据库 我能够在网格中显示数据 但是当我尝试通过模式表单添加或编辑数据行时 我收到一条消息 未设置 URL 但是 editurl 应该包含什么 mysql插入语句 我正在使
  • 如何在 TypeScript 中使用 Node `http` 模块

    我需要用 TypeScript 和 Node js 编写一个服务器 我下载了Node https github com DefinitelyTyped DefinitelyTyped blob master node node d ts f
  • 从 Dispatcher.RunAsync() 返回一个值到后台线程

    我正在使用 Dispatcher RunAsync 从后台线程显示 MessageDialog 但我无法弄清楚如何返回结果 My code bool response false await dispatcher RunAsync Wind
  • 使用 Livewire 和 Filepond 编辑模型时处理预先存在的图像

    我有一个 Filepond 组件 非常适合将图像上传到帖子 然而 当我需要编辑帖子及其预先存在的图像时 我正在与 Filepond 作斗争 我想用 Post 模型预先存在的图像加载 Filepond 目标是允许用户在编辑 Post 模型时上