Laravel php 通过 sftp 删除目录(文件夹)

问题描述 投票:0回答:3

最终更新:我使用了一个名为 phpseclib 的库https://phpseclib.com/,我终于可以删除文件夹了。目前该功能已经上线约2个月了

我正在尝试通过 sftp 删除服务器上的文件夹。我正在使用 php 7.4.13 和 laravel 7.30.4

我已经设置了 sftp 驱动器,一切(上传、删除文件、创建目录)工作正常。

但唯一的问题是我无法删除文件夹。

我正在使用

deleteDirectory($directory)
函数,该函数写在 Laravel 官方文档中: https://laravel.com/docs/7.x/filesystem

这是我的设置:

filesystem.php

'disks' => [
    'sftp' => [
        'driver' => 'sftp',
        'host' => env('SFTP_HOST'),
        'username' => env('SFTP_USERNAME'),
        'password' => env('SFTP_PASSWORD'),
        'timeout' => env('SFTP_TIMEOUT'),
        'port' => env('SFTP_PORT'),
]

这是我的代码:

Storage::disk('sftp')->deleteDirectory('path/to/folder')

但是该文件夹仍然存在,并且该文件夹内的所有文件也仍然存在。没有错误消息。而且,如果我

dd()
上面的代码,它会返回
true

我拥有在此服务器上创建、写入和删除的所有权限。我还可以通过 sftp 使用 WinSCP 删除该服务器上的文件夹。

谁能告诉我哪一部分做错了或者我可以使用什么函数来实现这一点?

非常感谢,如果您需要的话我会提供更多信息。

TLDR: 我尝试过:

Storage::disk('sftp')->deleteDirectory('path/to/folder')
但不起作用。

编辑:文件权限

编辑2:尝试先删除文件夹内的所有文件,然后删除文件夹

$files = Storage::disk('sftp')->allFiles('QCS/test_folder');
Storage::disk('sftp')->delete($files);
try { Storage::disk('sftp')->deleteDirectory('QCS/test_folder', true); } catch (\Exception $e) { dd($e->getMessage()); }

编辑3:尝试删除

deleteDirectory()
函数的第二个参数

$files = Storage::disk('sftp')->allFiles('QCS/test_folder');
Storage::disk('sftp')->delete($files);
try { Storage::disk('sftp')->deleteDirectory('QCS/test_folder'); } catch (\Exception $e) { dd($e->getMessage()); }

对于编辑 2 和编辑 3: 文件夹内的文件被删除,但文件仍然存在,也没有错误;(

编辑4:我正在使用的整个方法以及我使用它的上下文。

其实整个方法就这么几行代码,因为我想让测试更简单。目标是删除服务器上的文件夹

testing_folder
。仅供参考,我们正在使用 Synology 的服务。

这是我的代码: 在

web.php

Route::get('/InspectionDocument/test', 'InspectionDocumentController@test')->name('inspdoc.test');

InspectionDocumentController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Controllers\RequestController;
use DB;
use Log;
use Auth;
use File;
use Storage;
use Response;
use ZipArchive;

class InspectionDocumentController extends Controller
{
    public function __construct()
    {
    }

    // other functions...

    public function test(Request $request)
    {
        $files = Storage::disk('sftp')->allFiles('QCS/test_folder');
        Storage::disk('sftp')->delete($files);
        Storage::disk('sftp')->delete('QCS/test_folder');
        try { Storage::disk('sftp')->deleteDirectory('QCS/test_folder', false); } catch (\Exception $e) { dd($e->getMessage()); }
    }

}

用于测试:首先我进入页面

http://localhost:8000/InspectionDocument/test
。然后页面加载,不会返回任何错误,如下所示:

运行代码之前:

运行代码后:

修改日期改变,里面的文件被删除了。

php laravel filesystems sftp laravel-filesystem
3个回答
1
投票

即使文档没有显示,

deleteDirectory()
也接受第二个参数
$preserver

@src/Illuminate/Filesystem/Filesystem.php

public function deleteDirectory($directory, $preserve = false)
{
    if (! $this->isDirectory($directory)) {
        return false;
    }

    $items = new FilesystemIterator($directory);

    foreach ($items as $item) {

        if ($item->isDir() && ! $item->isLink()) {
            $this->deleteDirectory($item->getPathname());
        }

        else {
            $this->delete($item->getPathname());
        }
    }

    if (! $preserve) {
        @rmdir($directory);
    }

    return true;
}

当第二个参数

$preserve
true
时,该方法将清空文件夹而不删除它。

就您而言,

 Storage::disk('sftp')->deleteDirectory('QCS/test_folder', true);
您要求它保留文件夹。

如果您也想删除基本文件夹,请删除第二个参数

 Storage::disk('sftp')->deleteDirectory('QCS/test_folder');

0
投票

在 POSIX 系统上删除目录的语义是,如果目录不为空(rmdir),则删除失败。 PHP 代码和远程文件系统之间有很多抽象层,但我希望实现该功能的代码仍然符合标准行为。但是我发现您链接的文档明确说明了其他情况。我怀疑文档是错误的,而实现是正确的。

您可以通过检查远程系统上的审核日志记录来实现这一点。

或者可能只是权限问题。你检查了吗?


0
投票

我使用了一个名为 phpseclib 的库https://phpseclib.com/,我终于可以删除文件夹了。现在该功能已经上线约2个月了

© www.soinside.com 2019 - 2024. All rights reserved.