2016-07-01 18 views
0

Ich versuche, ein Video von einer externen URL mit Symfony herunterzuladen. Also habe ich diese Route, wenn ich sie direkt im Browser anklicke, erhalte ich zwei mögliche Antworten: Das Video wird abgespielt oder (wenn der Browser es nicht reproduzieren kann), wird das Video von dieser externen URL heruntergeladen. Was ich versuche zu erstellen, ist eine Antwort vom Controller, um das Video immer herunterzuladen. Ich habe mehrere Lösungen ohne Glück versucht.symfony Video von URL herunterladen

Einige versuchten Lösungen:

$response = new BinaryFileResponse($url); 
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); 

return $response; 

Da es ausfällt keine statische Datei ist.

Auch

versucht
$response = new RedirectResponse($url); 
$response->headers->set('Content-Type', 'video'); 
$d = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT, 
$videoUrl 
); 
$response->headers->set('Content-Disposition', $d); 

Und natürlich die ‚StreamedResponse‘ ... Ich gehe davon aus das möglich ist, da ich bin das gewünschte Verhalten bekommen, wenn das Format nicht korrekt im Browser traduced ist ... Alle Hilfe wird geschätzt.

Antwort

2

Ich glaube nicht, BinaryFileResponse funktioniert mit URLs. Sie sollten eine Ausnahme für die Datei erhalten, die nicht lesbar ist.


Werfen Sie einen Blick auf StreamedResponse. Sie können einen benutzerdefinierten Rückruf verwenden, um den Browser alle Daten zu streamen:

use Symfony\Component\HttpFoundation\StreamedResponse; 

// ... 

$response = new StreamedResponse(); 

// attempt to generate a filename from the URL's path 
$filename = @preg_replace('~[^\w\-.]+~', '', iconv('UTF-8', 'ASCII//TRANSLIT', pathinfo(urldecode(parse_url($url, PHP_URL_PATH)), PATHINFO_BASENAME))) ?: 'video'; 

// set headers to force file download 
$response->headers->set('Content-Type', 'application/force-download'); 
$response->headers->set(
    'Content-Disposition', 
    $response->headers->makeDisposition(
     ResponseHeaderBag::DISPOSITION_ATTACHMENT, 
     $filename 
    ) 
); 

// stream content from the URL to the browser 
$response->setCallback(function() use ($url) { 
    $c = curl_init($url); 
    curl_exec($c); 
    curl_close($c); 
}); 
  • wenn $url vom Benutzer kommt, müssen Sie es bestätigen (wenn Sie dies nicht tun, dann können Benutzer missbrauchen)
  • die Remote-Datei wird heruntergeladen und gestreamt durch Ihre App, so dass Sie Probleme mit großen Dateien/langsame Verbindungen/Timeouts
  • gibt es keine Möglichkeit, den Download einer Remote-Ressource ohne Streaming es selbst zu erzwingen (es sei denn, der Remote-Server unterstützt explizit), daher die cURL-Lösung

In Bezug auf Ihrem anderen Versuch:

  1. Video keine gültigen Content-Type ist
  2. das zweite Argument von makeDisposition() sollte ein ASCII-Dateiname sein, nicht eine URL
  3. es macht keinen Sinn, solche Header für RedirectResponse setzen - es leitet nur den Browser so die Content-Disposition gilt nicht für die Ziel-URL
Verwandte Themen