2017-07-13 7 views
0

私が使用していたリモートサービスがあり、これはBase64でエンコードされたPDFを返します。次のように私はこれを使用していた:これはダウンロードして、私はメモリ内のファイル全体をロードすることなく、ユーザーにそれへのリンクを与えることができる公共のディスク上のPDFファイルを書き込むために使用された応答フィルターに変換フィルターを追加

$fp = fopen($url, "r"); 
$fn = md5($url).".pdf"; 
stream_filter_append($fp, 'convert.base64-decode'); 
\Storage::drive("public")->put($fn,$fp); 
return response()->json(["url"=>\Storage::drive("public")->url($fn)]); 

。ここでの問題は、ファイルが大きいことです(50MBのPDFはbase64でそれほど大きくなりません)。

リモートサーバーがfopenが処理できない内部リダイレクトを追加するまで、これはうまくいきました。 内部リダイレクトを処理する独自のソリューションを作成するのではなく、コードをGuzzleに移行することにしました。

これは私が試したものです:

$client = new Client(); 
$res = $client->request("GET", $url); 
$fp = $res->getBody(); 
$fn = md5($url).".pdf"; 
stream_filter_append($fp, 'convert.base64-decode'); //Works without this 
\Storage::drive("public")->put($fn,$fp); 
return response()->json(["url"=>\Storage::drive("public")->url($fn)]); 

問題は、コードがそれなしで正常に動作し、stream_filter_appendです。私が手にエラーが

は、stream_filter_append()は、パラメータ1がリソースであることを期待され、オブジェクトが

がつがつ食う応答の身体上のストリームフィルタを追加する方法はあり

を与えられましたか?

答えて

0

これを行うために、私は地震の流れから根源的な資源を得なければならなかった。どうやらがつがつ食うが、これを提供するために非常に満足している、ここに私のコードは次のとおりです。

$client = new Client(); 
$res = $client->request("GET", $url); 
$fp = $res->getBody()->dettach(); //The magic method. 
$fn = md5($url).".pdf"; 
stream_filter_append($fp, 'convert.base64-decode'); //Works without this 
\Storage::drive("public")->put($fn,$fp); 
return response()->json(["url"=>\Storage::drive("public")->url($fn)]); 

注:dettach方法は$res->getBody()->read()の後続用途は何もしませんので、どのような名前をがつがつ食うからのストリームを示唆して切り離しないこと。これはおそらく理想的ではありませんが、これを回避する方法が他にあるかどうかはわかりません。

関連する問題