Подтвердить что ты не робот

Файл не найден на пути при попытке копирования

Я пытаюсь скопировать файл из одного места в другое. Я уверен, что место правильное, но я все еще получаю ошибку в названии.

Вот код:

$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

И точная ошибка:

Файл не найден по пути: вар/WWW/apk.land/хранение/extracted_apks/RES/вытяжке-xxxhdpi-v4/icon.png

P.S. Функция PHP copy работает просто отлично.

Я не могу найти проблему здесь.

Любые предложения?

4b9b3361

Ответ 1

Прежде всего, если вы используете Laravel Storage Facade и с этим базовым Flysystem вы должны знать, что это не предназначенный для работы с абсолютными путями, как вы. Преимущество этого заключается в том, что вы потенциально можете работать с разными дисками хранения, все из которых имеют собственные конфигурации, которые можно установить в файле config/filesystems.php.

Предполагая, что вы ничего не изменили, диск "по умолчанию" по умолчанию будет локальным с корнем storage_path ( "приложение" ) (= путь к вашей папке/приложении для хранения laravel)

Если вы хотите знать, почему это не удается, мы должны взглянуть на исходный код, который вы найдете в следующем коде в файле vendor\league\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

'disks' = > [

    'local' => [
        'driver' => 'local',
        'root'   => storage_path('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./Рез.

Теперь вам нужно убедиться, что вы вызываете

Storage::copy($icon_source, $generated_icon_file);

Где $icon_source и $generated_icon_file относятся к вашему определенному "корню".

Ответ 2

Вы сказали, что ошибка такова:

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

Ответ 3

Попробуйте вместо File::copy($file, $dest) of Storage::copy($old, $new)
File::copy() - это оболочка функции PHP copy()

Ответ 4

Вставить / до var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png

Путь относится к текущему каталогу. Купите, если вы добавите /, путь будет абсолютным из корневого каталога.

Ответ 5

Вы должны выбрать правильный диск что-то вроде этого

$file2 ='public/'.$page->thumbnail;

$destination = 'public/bundles/ttt.png';

if( Storage::disk('local')->exists($file2)){

      Storage::disk('local')->copy($file2,$destination);
 }