ある場所から別の場所にファイルをコピーしようとしています。場所は正しいと確信していますが、タイトルにエラーが表示されます。
ここにいくつかのコードがあります:
$oDirectory = new \RecursiveDirectoryIterator($extractFolder.'/res');
$oIterator = new \RecursiveIteratorIterator($oDirectory);
foreach($oIterator as $oFile) {
if ($oFile->getFilename() == 'icon.png') {
$icons[filesize($oFile->getPath().'/icon.png')] = $oFile->getPath().'/icon.png';
}
}
asort($icons);
print_r($icons);
$icon_source = end($icons);
echo $icon_source;
$generated_icon_file = str_slug($packagename.$version).'.png';
Storage::copy($icon_source, $generated_icon_file);
print_r
戻り値(ファイルが存在することを意味します):
Array ( [19950] => /var/www/apk.land/storage/extracted_apks/res/drawable-xxhdpi-v4/icon.png [31791] => /var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png [6979] => /var/www/apk.land/storage/extracted_apks/res/drawable-hdpi-v4/icon.png [10954] => /var/www/apk.land/storage/extracted_apks/res/drawable-xhdpi-v4/icon.png )
エコーは次を返します。
/var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
そして、正確なエラーは次のとおりです。
パスにファイルが見つかりません:var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
P.S. PHPのcopy
関数は非常にうまく機能します。
ここで問題を見つけることができません。
助言がありますか?
まず、Laravelのストレージファサードを使用していて、その基礎となる Flysystem を使用している場合は、絶対パスを使用することを意図していないことを知っておく必要があります。その利点は、config /filesystems.phpファイルで設定できる独自の構成を持つさまざまなストレージディスクを使用できる可能性があることです。
そこで何も変更しなかったとすると、デフォルトの「ディスク」はローカルで、rootはstorage_path( 'app')(=あなたのlaravelストレージフォルダー/アプリ)へのパス)になります。
なぜ失敗するのかを知りたい場合は、ファイルベンダー\リーグ\ flysystem\src\Filesystem.phpの次のコードにあるソースコードを確認する必要があります。
public function copy($path, $newpath)
{
$path = Util::normalizePath($path); // <-- this will strip leading /
$newpath = Util::normalizePath($newpath);
$this->assertPresent($path); // this will cause the error in your case, because assertion cannot be fullfilled in case of missing leading /
$this->assertAbsent($newpath);
return $this->getAdapter()->copy($path, $newpath); // calls the copy of your Adapter, assuming local in your case
}
$ this-> getAdapter()-> copy($ path、$ newpath)が呼び出された場合、どうなるか見てみましょう。
ファイル(ローカルストレージディスクを想定):vendor\League\flysystem\src\Adapter\Local.php
public function copy($path, $newpath)
{
$location = $this->applyPathPrefix($path);
$destination = $this->applyPathPrefix($newpath);
$this->ensureDirectory(dirname($destination));
return copy($location, $destination);
}
この線
$location = $this->applyPathPrefix($path);
config /filesystems.phpで定義されているルートパスを先頭に追加します
'ディスク' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
私があなたのコードで見ることができるように、あなたのファイルはstorage/appに保存されていないので、これを 'root' => storage_path()に変更する必要があると思います
したがって、Storage :: copy()を使用する場合は、そのフォルダーからの相対パスを指定するだけです。そして、これをどのように達成できるかがわかりにくいので、それを見てください。
foreach($oIterator as $oFile) {
if ($oFile->getFilename() == 'icon.png') {
$icons[filesize($oFile->getPath().'/icon.png')] = $oIterator->getSubPath().'/icon.png';
}
}
RecursiveDirectoryIterator :: getSubPath (ただし、文書化されていませんが、反復の現在のサブパスが返されます。この場合、$ extractFolder。 '/ res'に関連しています。
今、あなたはあなたが呼んでいることを確認する必要があります
Storage::copy($icon_source, $generated_icon_file);
$ icon_sourceと$ generated_icon_fileは、定義された「ルート」を基準にしています。
エラーは次のようになっているとおっしゃいました。
File not found at path: var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
ここでのエラーは、var/www
で見つからないことを示しています。つまり、ファイルがapk.land/var/www
のどこかにあるのに対し、/var/www
を探しています。これに対する簡単な修正は、file
プロトコルを使用することです。次のように使用してください。
file:///var/www/storage/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
代わりにFile::copy($file, $dest)
を試してくださいof Storage::copy($old, $new)
File::copy()
はPHPcopy()
関数のラッパーです
/
の前にvar/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
を挿入します
パスは現在のディレクトリからの相対パスです。 /
を追加すると、パスはルートディレクトリから絶対になります。
このような適切なディスクを選択する必要があります
$file2 ='public/'.$page->thumbnail;
$destination = 'public/bundles/ttt.png';
if( Storage::disk('local')->exists($file2)){
Storage::disk('local')->copy($file2,$destination);
}