从 Laravel 中的任何给定路径复制文件

Copy file from any given path in Laravel

我想使用我自己创建的 artisan 命令从我的 Laravel 应用程序的根目录外部复制一个文件。用户将像这样调用命令:

php artisan crawl:pdf {filepath}

然后将处理文件路径,在这部分:

File::copy($path, storage_path('pdfs') . '/' . $fileName . ".pdf");

每次我使用我的根目录之外的路径时它都会中断,它显示“无法打开流:没有这样的文件或目录”作为错误消息。

我已经在 google 上搜索过使用 copy() 在 php 中复制文件,在 Laravel 中使用 Storage::copy()。还阅读了所有描述创建可以在 laravel-root-directory.

之外路由的磁盘的文章

所有这些都不能解决我的问题。用户应该可以使用任何路径。

C:\dir1\pdf3.pdf ; 
E:\dir456\pdf2222.pdf`
...

从他自己的文件系统复制文件到laravel-应用程序。

他们有办法吗?感谢提前提供的所有帮助!

编辑 1: 在有人问我是否有读写权限之前:是的,我有。如果我使用纯 php 我可以在我的工作驱动器上随处写入和读取。我还使用 echo whoami 检查了用户 laravel 是否处于 运行 并且它提供了与我的普通 php 应用程序相同的用户,该应用程序工作正常。

编辑 2: 在有关使用 File-Facad-copy

的评论中工作

好的,我找到了一个解决方案,现在它可以正常工作了。

但首先为什么会这样。 Laravel 期望始终使用磁盘处理文件。这是必需的。

解决方案是On-demand Disks!!!

这样就可以采用用户给定的路径并创建一个临时磁盘,该磁盘仅在这种情况下通过外立面工作。

重要的是确保给定的路径始终是一个目录!像这样:

$diskpath = dirname($path);
$disk = Storage::build([
    'driver' => 'local',
    'root' => "$diskpath",
]);

在我的例子中,我只想复制一个特定的文件,这使得必须获取文件信息才能正确命名和复制。像这样:

$pathinf = pathinfo($path)
$fileName = time() . '_' . $pathinf['filename']

接下来我们需要将它安全地保存到新位置。像这样:

Storage::disk('pdfs')->putFileAs('/', $path, $fileName . ".pdf");

备注:

  • 'pdfs'磁盘是我在filesystems.phpconfig-file
  • 中配置的磁盘
  • 我总是假设用户给出了文件的完整路径,例如 C:\...\test.pdf 或类似的东西,因此请注意 dirname() 函数。它总是会剪切路径的最后一部分并将其删除。

感谢 apokryfos 通过他的评论和提示帮助解决了这个问题。