Laravel XML下载不正确导出

时间:2017-01-02 16:35:51

标签: php xml laravel

我还在学习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内容或其他任何东西 - 只是数字。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

在这两种情况下你都错了。

  1. response::download response::download的论点是什么? 参见手册:
  2.   

    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
    
    1. response::make。同样的错误。
    2. 参见手册:

        

      response::make($contents, $statusCode);

      再次 - 第一个参数是$contents

      在您的代码中

      response::make(file_put_contents($path, $content),
      

      内容如果执行file_put_contents的结果,见上文。

      解决方案:

      response::make($content, 200, $headers);