我还在学习Laravel 5.3并且正在使用Guzzle连接到API以下载已经格式化的xml文件,我需要将其保存到本地用户的电脑以供进一步使用。
我创建了一个下载按钮:
<a href="{{ '/vendorOrder' }}" class="btn btn-large pull-right> Download Order </a>
我创建了一个名为OrderController.php的控制器:
<?php
namespace App\Http\Controllers\edi;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client as GuzzleHttpClient;
class OrderController extends Controller
{
public function vendorOrder()
{
try {
$filename = 'order.xml';
$path = storage_path($filename)';
$client = new GuzzleHttpClient();
$apiRequest = $client->request('GET', 'Https://urlapi') [
'headers' => [
'Authorization' => 'Basic QVBJVGVzdFVzZXIsIFdlbGNvbWVAMTIz',
'ContractID' => 'aa659aa2-4175-471f',
'Accept' => 'text/xml'
],
]);
$content = ($apiRequest->getBody()->getContents());
return response::download(file_put_contents($path, $content), '200', [
'Content-Type' => 'text/xml',
'Content-Disposition' => 'attachment; filename="'.$filename.'"'
]);
} catch (RequestException $re) {
echo $re;
}
}
}
和路线:
Route::get('/vendorOrder', 'edi\OrderController@vendorOrder');
我能够很好地连接,当我使用时,xml的内容显示得很好:
return response($content, '200')->header('content-type', 'text/xml');
但是当我使用时:
return response::make(file_put_contents($path, $content), '200', [
'Content-Type' => 'text/xml',
'Content-Disposition' => 'attachment; filename="'.$filename.'"'
]);
在上面的控制器中,我能够下载一个名为order.xml的文件(如预期的那样),但内容只是一个数字,即“1179866”。没有xml标签或xml内容或其他任何东西 - 只是数字。
任何帮助将不胜感激
答案 0 :(得分:3)
在这两种情况下你都错了。
response::download
response::download
的论点是什么?
参见手册:
Response::download($pathToFile);
请参阅 - 文件路径。在您的代码中:
return response::download(file_put_contents($path, $content), // other arguments
file_put_contents
的结果不是文件的路径。
阅读manual并查看file_put_contents
此函数返回写入文件的字节数,如果失败则返回FALSE。
解决方案:
$path = 'my/path/here';
file_put_contents($path, $content);
return response::download($path, // other arguments
response::make
。同样的错误。参见手册:
response::make($contents, $statusCode);
再次 - 第一个参数是$contents
。
在您的代码中
response::make(file_put_contents($path, $content),
内容如果执行file_put_contents
的结果,见上文。
解决方案:
response::make($content, 200, $headers);