如何删除服务器上的文件? FilePond.revert不会将参数传递给laravel控制器

时间:2019-04-07 11:39:50

标签: javascript php laravel filepond

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

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

FilePond 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());
    }

5 个答案:

答案 0 :(得分:0)

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

onload: function (responce) {
    console.log(JSON.parse(responce))
    return JSON.parse(responce).id // added
},

答案 1 :(得分:0)

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

也许是这样吗?

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);
}

答案 2 :(得分:0)

任何人仍在挣扎:

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

在控制器的还原方法中:

public function revert(Request $request){
     $fileId = request()->getContent();
     //use $fileId to delete file from filesystem
}

答案 3 :(得分:0)

我一直在努力使用FilePond还原/删除早期上传的文件,但经过数小时的努力,但在the docs上进行清理之后,我发现可以快速解决此问题。< / p>

在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:此代码仅用于演示目的,请保护您的表单并提供更好的用户体验。

答案 4 :(得分: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 控制器文件中销毁方法

public function destroy(Request $request)
{
    $folder = json_decode($request->getContent()); // folder name
}