Php 将转换过滤器添加到guzzle响应

Php 将转换过滤器添加到guzzle响应,php,laravel,laravel-5,guzzle,Php,Laravel,Laravel 5,Guzzle,我使用的远程服务返回base64编码的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($f

我使用的远程服务返回base64编码的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)]);
这是用来下载和写入公共磁盘上的PDF文件,这样我就可以给用户一个指向它的链接,而无需将整个文件加载到内存中。这里的问题是文件太大(base64中的50mb PDF文件太大)

在远程服务器决定添加一个
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\u filter\u append
,没有它,代码可以正常工作。我得到的错误是

stream_filter_append()希望参数1是给定的资源、对象


有没有办法在guzzle响应的主体上附加流过滤器?

为了做到这一点,我必须从guzzle流中获取底层资源。显然Guzzle很乐意提供这一点,以下是我的代码:

$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
方法执行名称所示的操作,并将流从Guzzle中分离出来,因此后续使用
$res->getBody()->read()
将不起任何作用。这可能不太理想,但我不知道是否还有其他办法