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?
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.
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
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
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.
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