从 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 通过他的评论和提示帮助解决了这个问题。
我想使用我自己创建的 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 通过他的评论和提示帮助解决了这个问题。