web-dev-qa-db-ja.com

コピーしようとしたときにパスにファイルが見つかりません

ある場所から別の場所にファイルをコピーしようとしています。場所は正しいと確信していますが、タイトルにエラーが表示されます。

ここにいくつかのコードがあります:

$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関数は非常にうまく機能します。

ここで問題を見つけることができません。

助言がありますか?

28
Alex

まず、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は、定義された「ルート」を基準にしています。

3
shock_gone_wild

エラーは次のようになっているとおっしゃいました。

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
9
Aditya Giri

代わりにFile::copy($file, $dest)を試してくださいof Storage::copy($old, $new)
File::copy()PHPcopy()関数のラッパーです

3
Halayem Anis

/の前に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);
 }
0
aitbella