我能够处理模型上预先存在的图像,特别是我能够重新排序图像.
为了处理图像的重新排序,我们需要来自服务器和 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.