2017-07-18 3 views
0

Je rencontre un problème de rendu vidéo à mon avis dans Laravel 5.4.Retour d'un fichier vidéo à une vue sur laravel 5.4

J'ai vue comme suit:

<main class="video-player"> 
    @if(!empty($video)) 
     <video id="my-video" class="video-js vjs-big-play-centered" controls data-setup="{}"> 
     <source src="{{url('video/'.$token.'/'.$video)}}" type="{{$video_mime_type}}"> 
     <p class="vjs-no-js"> 
      Please upgrade your browser. 
     </p> 
     </video> 
     @else 
      <div class="alert alert-info"><span class='fa fa-info-circle'></span> Lesson video is unavailable!!! </div> 
     @endif 
    </main> 

La route pour obtenir le contenu vidéo est la suivante:

Route::get('video/{token}/{video}','[email protected]_video'); 

Et la classe ResourceController est comme indiqué ci-dessous:

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use Storage; 
use Response; 
use File; 
use GuzzleHttp\Mimetypes; 
use App\Mime; 

class ResourceController extends Controller 
{ 

public function __construct() 
{ 
    $this->middleware('auth')->only('show_video'); 
} 
........ 
........ 
public function show_video($token,$filename) 
{ 
    $token=\App\VideoPermission::where('token',$token)->first(); 
    if(!empty($token)) 
    { 
    $token->delete();  
    $mime_type=Mime::from_extension($filename); 
    return response()->file(storage_path('app/lesson-files/'.$filename),[ 
     'Content-Type' => $mime_type, 
     'Content-Disposition' => 'inline; filename="Lesson-file"' 
     ]); 
    } 
    return false; 
    } 
} 

Lorsque je le joue sur un navigateur d'ordinateur portable, il fonctionne correctement comme prévu, mais lorsque j'essaie de lire la même vidéo un navigateur de téléphone mobile (même navigateur Chrome sur les deux situations), il jette l'exception suivante:

UnexpectedValueException: Le contenu de la réponse doit être une chaîne ou objet implémentant __toString(), « booléen » donné. dans /home/username/domainname.com/vendor/symfony/http-foundation/Response.php:409

S'il vous plaît quelqu'un pourrait me aider à comprendre la source du problème. Merci

+0

Le problème avec votre approche d'une solution est que si vous avez des fichiers vidéo plus volumineux, votre application sera à court de mémoire. Votre approche ne fonctionnera que si vous renvoyez le contenu des fichiers avec le type mime correct, mais cela implique votre code pour charger le fichier en mémoire, ce qui entraînera probablement une exception de mémoire insuffisante ... –

Répondre

0

J'ai découvert plus tard que le problème est le résultat d'une condition «si» dans la méthode qui renvoie le contenu du fichier. Ainsi, lorsque la condition n'est pas remplie pour une raison quelconque, elle renvoie 'false' comme réponse à la place du fichier vidéo, ce qui entraîne la réponse booléenne que je reçois.

C'est la façon dont le code est écrit pour fonctionner lorsque le jeton est manquante comme indiqué ci-dessous

if(!empty($token)) 
{ 
$token->delete();  
$mime_type=Mime::from_extension($filename); 
return response()->file(storage_path('app/lesson-files/'.$filename),[ 
    'Content-Type' => $mime_type, 
    'Content-Disposition' => 'inline; filename="Lesson-file"' 
    ]); 
} 
return false; 

}

J'ai découvert plus tard que cela se produit lorsque l'utilisateur tente d'accéder à l'application avec un navigateur obsolète qui ne remplit pas l'une des conditions attendues pour retourner le contenu vidéo. En d'autres termes, le système fonctionne réellement comme prévu.

Merci à tous ceux qui ont essayé d'aider d'une manière ou d'une autre. Je vous apprécie tous.