Archivo no encontrado en la ruta al intentar copiar


Estoy tratando de copiar un archivo de una ubicación a otra. Estoy bastante seguro de que la ubicación es correcta, pero todavía estoy recibiendo el error en el título.

Aquí hay un código:

$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);

El print_r devuelve (lo que significa que los archivos existen):

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 )

El eco vuelve:

/var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png

Y el error exacto es:

Archivo no encontrado en la ruta: var / www / apk.land / storage/extracted_apks/res/drawable-xxxhdpi-v4 / icon.png

P. S. La función copy de PHP funciona simplemente genial.

No puedo encontrar el problema aquí.

Alguna sugerencia?

Author: tarzanbappa, 2015-08-19

4 answers

En primer lugar, si está utilizando la Fachada de Almacenamiento de Laravel y con eso el subyacente Flysystem debe saber, que no está destinado a funcionar con rutas absolutas como lo hizo. El beneficio de esto es, que potencialmente podría trabajar con diferentes discos de almacenamiento, que todos tienen configuraciones propias, que se pueden establecer en sus sistemas de configuración/archivos.archivo php.

Suponiendo que no cambiaste nada allí, el "disco" predeterminado sería local con una raíz de storage_path ('app') (= la ruta a su carpeta/aplicación de almacenamiento laravel)

Si quieres saber por qué está fallando, tenemos que echar un vistazo al código fuente que encontrarás en el siguiente código en el archivo 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
}

Así que eche un vistazo, ¿qué pasaría, si $this->getAdapter()->copy($path, $newpath) fue llamado:

Archivo (suponiendo un disco de almacenamiento local): 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);
}

La línea

$location = $this->applyPathPrefix($path);

Precederá a la ruta raíz definida en config / filesystems.php

'disks' = > [

    'local' => [
        'driver' => 'local',
        'root'   => storage_path('app'),
    ],

Como puedo ver en su código, sus archivos no se almacenan en almacenamiento / aplicación, así que creo que tienes que cambiar esto a 'root' = > storage_path ()

Así que si quieres usar Storage::copy() solo tienes que proporcionar rutas relativas a esa carpeta. Y como es difícil de ver, cómo se podría lograr esto, echar un vistazo a eso.

    foreach($oIterator as $oFile) {
        if ($oFile->getFilename() == 'icon.png') {
            $icons[filesize($oFile->getPath().'/icon.png')] = $oIterator->getSubPath().'/icon.png';
        }
    }

Existe RecursiveDirectoryIterator:: getSubPath (Aunque bastante undocumentated, que le devolvería la subpath actual de sus iteraciones. En su caso relativo a extrac extractFolder.'/re'.

Ahora tienes que asegurarte de que estás llamando

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

Donde $icon_source y gener generated_icon_file son relativos a su 'root'definido.

 3
Author: shock_gone_wild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-20 19:01:37

Usted dijo que el error es así:

File not found at path: var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png

Aquí el error está diciendo que no puede encontrar en var/www eso significa que está buscando apk.land/var/www mientras que su archivo se encuentra en algún lugar en /var/www. Una solución rápida a esto puede ser usar el protocolo file. Simplemente úsalo como:

file:///var/www/storage/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png
 9
Author: Aditya Giri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 02:42:08

Pruebe con File::copy($file, $dest) en su lugar of Storage::copy($old, $new)
File::copy() es el wrapper en PHP copy() función

 3
Author: Halayem Anis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-17 15:52:06

Insértese / antes de var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png

La ruta es relativa al directorio actual. Comprar si agrega /, la ruta es absoluta desde el directorio raíz.

 3
Author: Alejandro Salamanca Mazuelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-19 22:28:23