2015-03-25 9 views
6

Ich speichere Dateien für eine Website auf Rackspace mit Flysystem. Das Hochladen ist kein Problem, Probleme, herauszufinden, wie man für eine Datei einen Download zu starten - das ist, was ichLaravel 5 Flysystem - Datei von Remotediskette herunterladen

Storage::disk('rackspace'); 
return response()->download('file-library/' . $file->filename); 

Das Ergebnis versucht habe, ist, dass die Datei nicht gefunden werden kann. Fügt man Storage::disk() hinzu, um Laravel an dieser Stelle und nicht lokal aussehen zu lassen? Was ist der beste Weg, dies zu erreichen?

Antwort

-3

Ist Storage::disk() ausreichend, um Laravel an dieser Stelle und nicht lokal aussehen zu lassen?

Nein, das würde response()->download() Anrufe nicht beeinflussen.

So etwas sollte funktionieren:

return response()->download(Storage::disk('rackspace')->get('file-library/' . $file->filename)); 
+0

'is_file() erwartet, dass Parameter 1 ein gültiger Pfad ist, String gegeben'. Der erste Parameter von Download ist ein Pfad (String) – NightMICU

+0

@NightMICU Sie müssen es möglicherweise in eine temporäre Datei herunterziehen, denke ich. Oder verknüpfen Sie den Benutzer direkt mit dem Speicher von Rackspace. – ceejayoz

+0

@ceeyaoz scheint seltsam, dass sie nicht daran gedacht hätten. Ich möchte vermeiden, mich mit temporären Dateien herumschlagen zu müssen (die Idee war, alle Dateien dieses Typs von meinem lokalen Dateisystem fernzuhalten) und hoffte, einen Download zu starten, ohne dass der Benutzer die aktuelle Seite verließ. – NightMICU

18

Frank hier aus Flysystem.

Der bevorzugte Weg, dies zu tun wäre, den readStream-Ausgang in Kombination mit Response :: stream zu verwenden.

<?php 

$fs = Storage::disk('diskname')->getDriver(); 
$stream = $fs->readStream($file); 

return Response::stream(function() use($stream) { 
    fpassthru($stream); 
}, 200, [ 
    "Content-Type" => $fs->getMimetype($file), 
    "Content-Length" => $fs->getSize($file), 
    "Content-disposition" => "attachment; filename=\"" . basename($file) . "\"", 
]); 

Die $fs ist die League\Flysystem\Filesystem Instanz. Ich glaube, es gibt eine Methode, um diese Instanz in der Dateisystem-Klasse, die Laravel bereitstellt, abzurufen.

+0

Hallo Frank, danke dafür - wäre es möglich, mit einem bekannten Beispiel in Laravel zu aktualisieren? Ich bin ein großer verloren mit der Filesystem-Instanz, da es Laravel – NightMICU

+0

betrifft Ich habe es in der ersten Zeile hinzugefügt. –

+0

Ich kann bestätigen, dass dies in Lumen funktioniert, sehe keinen Grund, warum es nicht in Laravel 5 –