3

FilePond.revert 不会将唯一 id 文件传输到 laravel 控制器。

如何通过ID删除下载的文件?

文件池 JS

var csrf = $('meta[name="csrf-token"]').attr('content'); 

    FilePond.setOptions({
        server: {
            url: '/file/upload/',
            process: {
                url: 'process',
                headers: {
                    'X-CSRF-TOKEN': csrf
                },
                onload: function (responce) {
                    console.log(JSON.parse(responce))
                },
            },
            revert: {
                url: 'revert',
                headers: {
                    'X-CSRF-TOKEN': csrf
                },
                onload: function (x) {

                    // X - empty, why????
                    console.log(x)

                },
            },
            load: {
                url: 'load/',
            },
        },
    })

    FilePond.create(document.querySelector('.filepond[type="file"]'), {
        files: [
            {
                source: '11',
                options: {
                    type: 'local',
                }
            },
        ]
    });

加载图片成功。返回唯一 ID 文件作为响应。

public function process(){

        $file = FilesUploadService::save();

        return response($file->collection->id, 200)
            ->header('Content-Type', 'text/plain');
    }

此处为空,我找不到文件 ID。哪些需要删除

public function revert(Request $request){
        return response()->json($request->all());
    }
4

6 回答 6

1

你让这个工作了吗?FilePondDELETE在还原时使用标头,这可能就是您没有从请求中得到任何东西的原因。

也许是这样的?

public function revert(){
    $response = new stdClass();
    if ($_SERVER['REQUEST_METHOD'] === 'DELETE') {
    $file_name = strip_tags(file_get_contents("php://input"));
        if (is_string($file_name) && FilesUploadService::delete($file_name)) {
            $response->id = $file_name;
            $response->success = true;
        } else {
            $response = false;
        }
    } else {
        $response = false;
    }
    return response()->json($response);
}
于 2019-04-11T08:18:35.033 回答
1

还在苦苦挣扎的人:

request->getContent() 将返回 filepond 发送的请求载荷。

在控制器中的还原方法中:

public function revert(Request $request){
     $fileId = request()->getContent();
     //use $fileId to delete file from filesystem
}
于 2019-07-16T04:19:35.470 回答
1

下面的onload方法应该向 FilePond 返回一个唯一的 id。因此,例如,如果在您中找到唯一 ID,则responce.id添加返回行,如图所示。

onload: function (responce) {
    console.log(JSON.parse(responce))
    return JSON.parse(responce).id // added
},
于 2019-04-08T06:49:39.407 回答
1

FilePond几个小时以来,我一直在努力恢复/删除早期上传的文件,但在浏览了那里的文档后,我想出了一个快速解决问题的方法。

在您的 JavaScript 方面,您将执行以下操作以通过XHR对象上传文件:

<script>
        const pondElement = document.querySelector('input[type="file"]');
        const pond = FilePond.create( pondElement );

        FilePond.setOptions({
            server: {
                url: "{!! route('ajax.uploadFiles') !!}",
                process: {
                    headers: {
                        'X-CSRF-TOKEN': '{!! csrf_token() !!}'
                    }
                },
            }
        });
</script>

现在到棘手的部分:恢复/删除:

<script>
        const filepond_root = document.querySelector('.filepond--root');
        filepond_root.addEventListener('FilePond:processfilerevert', e => {
            $.ajax({
                url: "{!! route('ajax.revertFiles') !!}",
                type: 'POST',
                data: {'_token': '{!! csrf_token() !!}', 'filename': e.detail.file.filename}
            })
        });
</script>

在您的 ServerSide (Laravel) 上,它就像以下一样简单直接:

public function uploadFiles(Request $request)
{
    if ($request->has('attachments')) {
        if (!file_exists(storage_path('app/tmp'))) {
            mkdir(storage_path('app/tmp', 0777, true));
        }

        $file = $request->file('attachments')[0];
        $file_name = $file->getClientOriginalName();

        $file_path = storage_path("app/tmp/{$file_name}");

        $file->storeAs(null, $file_name, 'tmp');
    }
}

public function revertFiles(Request $request)
{
    unlink(storage_path("app/tmp/{$request->filename}"));
}

PS:此代码仅用于演示目的,请保护您的表单并提供更好的用户体验。

于 2020-01-27T23:08:22.387 回答
0

我遇到了完全相同的问题。我做了两件事来解决它。

  1. 必须具有该process.onload功能并返回对象 ID/路径。此 ID/路径将自动传递给恢复功能。

  2. revert在处理调用的控制器方法中。步骤 1 中的 Id/path,可以从调用中获取$request->getContent(),注意$request->all()不能获取值。

于 2022-02-13T22:37:43.400 回答
0

Laravel 刀片文件中的 Filepond 脚本

<!-- filepond script -->
<script>
    const inputElement = document.querySelector('input[id="file"]');
    const pond = FilePond.create( inputElement );
    FilePond.setOptions({
        server: {
            headers: {
                'X-CSRF-TOKEN': '{{ csrf_token() }}'
            },
            process: {
                url: '{{ route('store') }}',
            },
            revert: {
                url: '{{ route('destroy') }}',
            }
        }
    });
</script>

Laravel Controller 文件中的销毁方法

public function destroy(Request $request)
{
    $folder = json_decode($request->getContent()); // folder name
}
于 2021-03-24T16:07:47.607 回答