

どうしても解決ができておらず、ご存知の方々にお聞きしたいと思います。

結論から申し上げますと、Azure Storage上にある動画ファイルを再生したいです。  
しかし、Local環境と開発環境と動きが異なり、iPhoneの再生ができません。

**やってみたこと１**

[code]

        $path = Storage::disk('local')->path("common/".$fileName);
        $file_size = filesize($path);
        $fp = fopen($path, 'rb');
        $status_code = 200;
        $headers = [
            'Content-type' => 'video/mp4',
            'Accept-Ranges' => 'bytes',
            'Content-Length' => $file_size
        ];
    
        $range = $request->header('Range');
    
        if(!is_null($range)) {
            if(preg_match('|bytes=([0-9]+)\-|', $range, $matches)) {
                $start = intval($matches[1]);
                if(fseek($fp, $start) === 0) {
                    $status_code = 206;
                    $headers['Content-Length'] = $file_size - $start;
                    $headers['Content-Range'] = sprintf(
                        'bytes %d-%d/%d',
                        $start,
                        ($file_size-1),
                        $file_size
                    );
                }
            }
        }
        return response()->stream(function() use($fp) {
            fpassthru($fp);
        }, $status_code, $headers);
    
[/code]

Storageを'azure'に変更して、サーバー上に行くと、pathが **storage/app 以降から**
始まりまして、fopenが効かなかったです。  
FullPathを返したらできるかと思い、試してみましたが、うまくできませんでした。

> Localでpathを実行したら  
>  C:\Users\・・・\storage\app\common\filename.mp4
>
> サーバーでpathを実行したら  
>  common\filename.mp4

**やっていみたこと２**

[code]

    $file_size = Storage::disk('azure')->size("common/".$fileName);
    $content = Storage::disk('azure')->get("common/".$fileName);
    return response($content)->header('Content-Type', 'video/mp4', 'Accept-Ranges', 'bytes');
    
[/code]

PCクロームでは再生ができましたが、PC Internet Explorer、iPhone Safariでは再生ができませんでした。

現在のコード

[code]

    $url = Storage::disk('azure')->url("common/".$fileName);
    $path = storage_path(Storage::disk('azure')->path("common/".$fileName));
    
        if (file_exists($url)) {
            $file_size = filesize($url);
            $fp = fopen($url, 'rb');
        } elseif (file_exists($path)) {
            $file_size = filesize($path);
            $fp = fopen($path, 'rb');
        } else {
            // この方式はiPhoneでは開かない
            $file_size = Storage::disk('azure')->size("common/".$fileName);
            $content = Storage::disk('azure')->get("common/".$fileName);
            return response($content)->header('Content-Type', 'video/mp4', 'Accept-Ranges', 'bytes');
        }
    
        $status_code = 200;
        $headers = [
            'Content-type' => 'video/mp4',
            'Accept-Ranges' => 'bytes',
            'Content-Length' => $file_size
        ];
        $range = $request->header('Range');
    
        if(!is_null($range)) {
            if(preg_match('|bytes=([0-9]+)\-|', $range, $matches)) {
                $start = intval($matches[1]);
                if(fseek($fp, $start) === 0) {
                    $status_code = 206;
                    $headers['Content-Length'] = $file_size - $start;
                    $headers['Content-Range'] = sprintf(
                        'bytes %d-%d/%d',
                        $start,
                        ($file_size-1),
                        $file_size
                    );
                }
            }
        }
        return response()->stream(function() use($fp) {
            fpassthru($fp);
        }, $status_code, $headers);
    
[/code]

どう修正すれば iPhone でも再生ができますでしょうか。  
ご存知の方、教えて頂けますと幸いです。  
よろしくお願い申し上げます。  


CC BY-SA 4.0
2020-11-26T06:16:59.530
72221
2020-11-26T06:16:59.530
42874
question
php laravel stream
Laravel Storageに保存されている動画をheader、またはstream関数で再生したいです。