BinaryFileResponse in Laravel undefiniert

Lesezeit: 4 Minuten

Benutzer-Avatar
Sebastian Greb

Ich habe folgendes Problem: Ich möchte ein Bild auf der Route /getImage/{id} zurückgeben. Die Funktion sieht so aus:

public function getImage($id){
   $image = Image::find($id);
   return response()->download('/srv/www/example.com/api/public/images/'.$image->filename);
}

Wenn ich das mache, gibt es mir das zurück:

FatalErrorException in HandleCors.php line 18:
Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()

ich habe use Response; am Anfang des Controllers. Ich glaube nicht, dass die HandleCors.php das Problem ist, aber trotzdem:

<?php namespace App\Http\Middleware;
use Closure;

use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Http\Response;

class CORS implements Middleware {

public function handle($request, Closure $next)
{
      return $next($request)->header('Access-Control-Allow-Origin' , '*')
            ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
     }
}

Ich weiß eigentlich nicht, warum das passiert, da es genau so ist, wie es in den Laravel-Dokumenten beschrieben ist. Ich habe Laravel aktualisiert, als ich den Fehler bekam, aber das hat ihn nicht behoben.

  • Welche Version von Laravel verwendest du?

    – Philipp

    26. März 2015 um 21:33 Uhr

  • Version 5.0.21 nach dem Update und vor 5.0.14

    – Sebastian Grebe

    26. März 2015 um 21:35 Uhr

  • Sie sollten verwenden return response()->download(public_path("images/'.$image->filename")); oder etwas ähnliches.

    – DutGRIFF

    26. März 2015 um 22:05 Uhr


  • Nun, der Fehler scheint ziemlich richtig zu sein: Sie können keinen Header der $request setzen, nur der Response..

    – Philipp

    26. März 2015 um 22:16 Uhr

  • Und was ist die Lösung, weil ich mir im Moment nicht sicher bin, was ich tun soll?

    – Sebastian Grebe

    26. März 2015 um 22:17 Uhr

Benutzer-Avatar
Baumgesicht

Das Problem ist, dass Sie anrufen ->header() auf einen Response Objekt, das diese Funktion nicht hat (die Symfony\Component\HttpFoundation\BinaryFileResponse Klasse). Das ->header() Funktion ist Teil einer Eigenschaft die von Laravel verwendet wird Reaktionsklassenicht die Basis-Symfony-Antwort.

Glücklicherweise haben Sie Zugriff auf die headers Eigentum, so können Sie dies tun:

$response = $next($request);

$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');

return $response;

  • Ich habe es so geändert, wie Sie es gesagt haben, und es hat wirklich geholfen, aber jetzt wird in der zweiten Zeile der Fehler “Versuchen, die Eigenschaft eines Nichtobjekts zu erhalten” angezeigt.

    – Sebastian Grebe

    26. März 2015 um 22:04 Uhr

  • @ Sebi55 eh mein schlechtes. Deutlich ->set() ist nicht kettenfähig.

    – Baumgesicht

    26. März 2015 um 22:45 Uhr

  • Ja das war auch meine Idee. Irgendeine andere Idee, wie man die Middleware repariert, um mit der BinaryFileResponse zu arbeiten?

    – Sebastian Grebe

    26. März 2015 um 22:50 Uhr

  • Ich verstehe Ihre Antwort nicht besonders, aber es hat für mich funktioniert. 🙂

    – Rohan

    18. November 2015 um 7:32 Uhr

  • @treeface, es hat für mich funktioniert, danke, aber es hat nicht funktioniert, bevor jeder Anweisung ein Semikolon hinzugefügt wurde. Können Sie bitte für jede der Aussagen ein Semikolon hinzufügen?. Es wird für zukünftige Benutzer hilfreich sein

    – Wahnsinn

    25. April 2017 um 9:30 Uhr


Benutzer-Avatar
Markus

Möglicherweise möchten Sie Header ausschließen oder andere Header für festlegen file Download-Anforderungen durch Aktivieren der header Methode existiert in der zurückgegebenen Closure.

Datei-Download-Anforderungen haben normalerweise die header Methode weggelassen Closure.


public function handle($request, Closure $next)
{
    $handle = $next($request);

    if(method_exists($handle, 'header'))
    {
        $handle->header('Access-Control-Allow-Origin' , '*')
               ->header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE')
               ->header('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
    }

    return $handle;
    
}

Wenn Sie Header für a file Anfrage (wie andere Antwort vorgeschlagen) $handle->headers->set() kann in einem verwendet werden else Bedingung:


public function handle($request, Closure $next)
{
    $handle = $next($request);

    if(method_exists($handle, 'header'))
    {
        // Standard HTTP request.

        $handle->header('Access-Control-Allow-Origin' , '*');

        return $handle;
    }

    // Download Request?

    $handle->headers->set('Some-Other-Header' , 'value')

    return $handle;
    
}

Wenn Sie Middleware erstellt haben, um den Back History zu verhindern, und Sie jetzt eine Datei herunterladen möchten, erhalten Sie die folgende Fehlermeldung: Call to undefined method Symfony\Component\HttpFoundation\BinaryFileResponse::header()

Sie sollten daher Ihre PreventBackHistory-Datei wie folgt bearbeiten:

public function handle($request, Closure $next)
    {
 
        $headers = [
            'Cache-Control'      => 'nocache, no-store, max-age=0, must-revalidate',
            'Pragma'     => 'no-cache',
            'Expires' => 'Sun, 02 Jan 1990 00:00:00 GMT'
        ];
        $response = $next($request);
        foreach($headers as $key => $value) {
            $response->headers->set($key, $value);
        }
 
        return $response;       
    }

In Ihre CORS.php-Datei, die Sie erstellt haben, sollten Sie die folgenden Codezeilen einfügen:

 public function handle($request, Closure $next)
    {
        $response = $next($request);

        $response->headers->set('Access-Control-Allow-Origin' , '*');
        $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
        $response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
        
        return $response;
     }

Das hat bei mir funktioniert! Ich hoffe, es wird hilfreich sein.

public function handle($request, Closure $next)
{
        
        $response = $next($request);
        $headers = [
            'Access-Control-Allow-Origin' => '*',
            'Access-Control-Allow-Methods' => 'GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS',
            'Access-Control-Allow-Headers' => '*',
        ];

        foreach($headers as $key => $value) {
            $response->headers->set($key, $value);
        }

        return $response;
}

1180030cookie-checkBinaryFileResponse in Laravel undefiniert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy