2015-08-19 17 views
30

Sto provando a copiare un file da una posizione a un'altra. Sono abbastanza sicuro che la posizione sia corretta, ma sto ancora ricevendo l'errore nel titolo.File non trovato nel percorso durante il tentativo di copiare

Ecco po 'di codice:

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

I print_r rendimenti (il che significa che i file esistono):

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) 

I ritorni di eco:

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

E l'errore esatto è:

File non trovato nel percorso: var/www/apk.land/Garage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png

P.S. La funzione PHP copy funziona alla grande.

Non riesco a trovare il problema qui.

Qualche suggerimento?

+0

sembra che il "var" è il sanguinamento come parte del l'inizio del webaddress. È destinato? – JJFord3

+0

@ JJFord3 Cosa intendi? Non ho capito :) – Alex

+0

Il percorso nell'errore è: var/www/apk.land/storage/extracted_apks/res/drawable-xxxhdpi-v4/icon.png Dovrebbe essere www/apk.land/storage /extracted_apks/res/drawable-xxxhdpi-v4/icon.png? – JJFord3

risposta

3

Prima di tutto, se si utilizza Laravel's Storage Facade e con ciò il sottostante Flysystem devi sapere che non è destinato a funzionare con percorsi assoluti come hai fatto tu. Il vantaggio è che potresti potenzialmente lavorare con diversi dischi di archiviazione, che hanno tutti le proprie configurazioni, che possono essere impostate nel tuo file config/filesystems.php.

Supponendo che non è stata modificata anythig lì, il "disco" default sarebbe locale con una radice di storage_path ('app') (= il percorso della cartella di archiviazione laravel/app)

Se si desidera sappi, perché sta fallendo, dobbiamo dare un'occhiata al codice sorgente che troverai nel seguente codice nel file 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 
} 

Quindi uno sguardo, quello che sarebbe andare avanti, se $ this-> getAdapter() -> copia ($ path, $ newpath) è stato chiamato:

File (supponendo disco di archiviazione locale) : fornitore \ lega \ 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 linea

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

sarà anteporre il percorso principale come definita in config/fi lesystems.php

'dischi' => [

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

Come posso vedere nel codice i file sono non vengono memorizzati in deposito/app, così ho penso che si debba cambiare questo a 'root '=> percorso_scatenamento()

Quindi, se si desidera utilizzare Storage :: copy(), è sufficiente fornire percorsi relativi a tale cartella. E poiché è difficile da vedere, come si può ottenere questo, dare un'occhiata a questo.

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

C'è RecursiveDirectoryIterator::getSubPath (Anche se abbastanza undocumentated, che sarebbero ritornati la sottotracciato corrente dei iterazioni. Nel tuo caso relativo a $ ExtractFolder. '/ Res'.

Ora è necessario assicurarsi che si chiedono

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

Dove $ icon_source e $ generated_icon_file sono relative al tuo 'root' definito.

9

Lei ha detto che l'errore è come questo:

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

Qui errore dicendo che non riesce a trovare in var/www che significa che è alla ricerca di apk.land/var/www, mentre il file si trova da qualche parte in /var/www. Una soluzione rapida a questo può essere utilizzare il protocollo file. Basta usare le cose come:

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

Prova con File::copy($file, $dest) invece of Storage::copy($old, $new)
File::copy() è l'involucro sulcopy() funzione di PHP

3

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

Il percorso è relativo alla directory corrente. Acquista se aggiungi /, il percorso è assoluto dalla directory principale.

+1

Potresti aggiungere ulteriori spiegazioni sul perché questo risolverà il problema? – AJFarmar

+4

L'aggiunta di un/non risolverà il problema, poiché all'inizio/vengono eliminati durante Storage :: copy() –

+1

Ha già un /, come puoi vedere nel mio codice, ma viene rimosso da Laravel. – Alex

Problemi correlati