如何使用symfony 4从csv feed URL下载数据?

时间:2019-06-19 11:51:48

标签: download symfony4

使用Symfony 4,我需要从远程URL下载数据。我可以使用Symfony 4还是需要使用JQuery或Python或...?我要解析URL的内容还是可以从URL下载csv文件?

我是新手,所以请跟我说话,就好像我是个假人。

我正在Symfony 4中开发一个Web应用程序,由于该应用程序在其自己的Web应用程序中提供了URL,因此应该从合作伙伴商店下载数据(通过symfony命令和CRON任务):

 public function indexShortcode(Request $request)
{
    if(Auth::user()->id == 1)
        $shortcodes = Shortcode::all();
    else 
        $shortcodes = Shortcode::where('user_id',Auth::user()->id);
    return $shortcodes;
}

我看过这个线程: how to download a file from a url with javascript? 第一个答案看起来很有趣,但是正如我所说,我是个新手,我也不知道如何在命令中实现脚本。 而且我还看到了Ruby或Angular的其他线程: How do I download a file with Angular2 How to display and import data from a feed url? 但这对我没有太大帮助...

编辑:我试图将url传递给fopen,但它返回HTTP / 1.1 403 Forbidden:访问被拒绝。

update:到目前为止,这是我的代码(不多,我承认),其中包括我尝试过的所有内容和结果:

 Wine Title Vintage Country Region  Sub region  Appellation Color   Bottle Size Price   URL FORMAT
The Last Drop 1971 Scotch       Scotland                    750ML   3999.99 HTTP://buckhead.towerwinespirits.com/sku63174.html  1x750ML
Petrus Pomerol  2015    France  Bordeaux                750ML   3799.99 HTTP://buckhead.towerwinespirits.com/sku40582.html  1x750ML
Remy Martin Louis XIII Cognac       France  Cognac              750ML   3499.99 HTTP://buckhead.towerwinespirits.com/sku15758.html  1x750ML
Hennessy Paradis Imperial Cognac        France  Cognac              750ML   3299.99 HTTP://buckhead.towerwinespirits.com/sku51487.html  1x750ML

这是我的转换器的代码:

    class UpdateArticlesCommand extends Command
    {
        protected static $defaultName = 'app:update-articles';
        protected $em = null;

        protected function configure()
        {
            $this
                ->setDescription('Updates the articles of the stores having set a feed URL')
                ->setHelp('This command allows you to update the articles of the stores which have submitted a feed URL');
        }

        /**
         * UpdateArticlesCommand constructor.
         * @param EntityManagerInterface $em
         * @param string|null $name
         */
        public function __construct(EntityManagerInterface $em, ?string $name = null)
        {
            $this->em = $em;
            parent::__construct($name);
        }


        protected function execute(InputInterface $input, OutputInterface $output)
        {
            $io = new SymfonyStyle($input, $output);
            $io->title('Attempting to import the feeds...');
            $converter = new ConverterToArray();
$io->writeln([$store->getFeedUrl()]);

            $url = $store->getFeedUrl();
//            dd($url);     //OK
            $feedColumnsMatch = $store->getFeedColumnsMatch();
//            dd($feedColumnsMatch);    //OK


            $fileName = $store->getName().'Feed.txt';
            $filePath = $fileUploader->getTargetDirectory() . "/" . $fileName;

                                                               /* //sends a http request and save the given file
                                                                set_time_limit(0);
                                                                $fp = fopen($filePath, 'x+');

                                                                $ch = curl_init($url);
                                                                curl_setopt($ch, CURLOPT_TIMEOUT, 50);

                                                                // give curl the file pointer so that it can write to it
                                                                curl_setopt($ch, CURLOPT_FILE, $fp);
                                                                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

                                                                $data = curl_exec($ch);//get curl response
                                                                curl_close($ch);

                                                                dd($data);          //return false*/



                                                                /*dd($this->curl_get_file_contents($url));        //returns false*/


            $client = new Client();
            $response = $client->request('GET', $url);

            echo $response->getStatusCode(); # 200
            echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8'
            echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}'

            $articlesArray = $converter->convert("https://myURL.com", $feedColumnsMatch);
            }
            $io->success('Successful upload');
        }

我想我错过了一步。我无法直接从URL读取文件,因此在尝试读取文件之前必须先检索该文件。我该怎么办?

1 个答案:

答案 0 :(得分:0)

要从供稿网址下载数据,例如我的csv文件, 您必须向URL发送请求。 Symfony并非旨在将请求发送到外部URL,因此您必须使用cURL或GoutteGuzzle。 我选择了Guzzle。这是我的用法:

 $client = new Client();
            $response = $client->request('GET', $url);

            echo "Status Code = ".$response->getStatusCode()."\n"; # 200
            echo 'Content Type = '.$response->getHeaderLine('content-type')."\n"; 

            $body = $response->getBody();

$ url是我必须将请求发送到的URL。

不要忘记在名称空间和类之间导入Guzzle: 使用GuzzleHttp \ Client;

使用此代码,您可以获取整个页面的内容,即所包含的html标签如下:

<!DOCTYPE html>
<html lang="en">
    <body>
        <pre>
            Wine Directory List
            <BR>
//here is the content of the csv file

        </pre>
    </body>
</html>

一旦获得数据,就必须将其写入文件中,以便创建

$filePath = 'public/my_data/myFile';

,然后创建/打开文件:

$fp = fopen($filePath, 'x');

然后您在文件中写入:

fwrite($fp, $body);

别忘了关闭文件以避免内存泄漏:

fclose($fp);

最后,您只需要在方便时转换文件即可。只需记住fopen()中的模式“ x”会创建一个文件,如果已经存在同名文件,则返回错误。