Как загрузить данные из URL-адреса канала csv с помощью symfony 4? - PullRequest
0 голосов
/ 19 июня 2019

В Symfony 4 мне нужно загрузить данные с удаленного URL. Могу ли я использовать Symfony 4 или мне нужно использовать JQuery или Python или ...? Разбираю ли я содержимое URL или могу ли я загрузить файл csv с URL?

Я новичок, поэтому, пожалуйста, говорите со мной, как будто я дурачок.

Я разрабатываю веб-приложение в Symfony 4, которое должно загружать данные (с помощью команды symfony и задачи CRON) из партнерских хранилищ благодаря URL-адресу, который они предоставляют в своем веб-приложении, например, вот так:

 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

Я видел эту тему: как скачать файл с URL с помощью JavaScript? Первый ответ выглядит интересно, но, как я уже сказал, я новичок и не знаю, как реализовать скрипт в моей команде. И я видел другие темы для Ruby или Angular: Как скачать файл с Angular2 Как отобразить и импортировать данные из URL фида? но это мне мало помогает ...

edit: я пытался передать URL в fopen, но он возвращает HTTP / 1.1 403 Forbidden: доступ запрещен.

обновление: вот мой код (не очень, я признаю) со всем, что я пробовал, и результаты:

    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');
        }

А вот код моего конвертера:

 /**
     * is used to convert a csv file into an array of data
     * @param $filePath
     * @param FeedColumnsMatch $feedColumnsMatch
     * @return array|string
     */
    public function convert($filePath, $feedColumnsMatch)
    {

//        if(!file_exists($filePath) ) {
//            return "existe pas";
//        }
//        if(!is_readable($filePath)) {
//            return "pas lisible";
//        }

        //this array will contain the elements from the file
        $articles = [];
        $headerRecord = [];

        if($feedColumnsMatch->getFeedFormat()==="tsv" | $feedColumnsMatch->getFeedFormat()==="csv"){
            if($feedColumnsMatch->getFeedFormat()==="csv"){
                $delimiter = $feedColumnsMatch->getDelimiter();
            }else{
                $delimiter = "\t";
            }

            //if we can open the file on mode "read"
            if (($handle = fopen($filePath, 'r')) !== FALSE) {
                //represents the line we are reading
                $rowCounter = 0;

                //as long as there are lines
                while (($rowData = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
                    //At first line are written the keys so we record them in $headerRecord
                    if(0 === $rowCounter){
                        $headerRecord = $rowData;
                    }else{      //for every other lines...
                        foreach ($rowData as $key => $value){       //in each line, for each value
                            // we set $value to the cell ($key) having the same horizontal position than $value
                            // but where vertical position = 0 (headerRecord[]
                            $articles[$rowCounter][$headerRecord[$key]]= $value;
                        }
                    }
                    $rowCounter++;
                }
                fclose($handle);
            }
        }
        return $articles;
    }

Думаю, я пропустил шаг. Я не могу прочитать файл непосредственно с URL-адреса, поэтому я должен извлечь файл, прежде чем пытаться его прочитать. Как я могу это сделать?

1 Ответ

0 голосов
/ 20 июня 2019

Чтобы загрузить данные с URL-адреса канала, в моем случае это CSV-файл, Вы должны отправить запрос на URL. Symfony не предназначен для отправки запросов на внешний URL-адрес, поэтому вы должны использовать cURL или Goutte или Guzzle . Я выбрал 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-теги, такие как:

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

        

Как только вы получите данные, вы должны записать их в файл, чтобы создать

$filePath = 'public/my_data/myFile';

и вы создаете / открываете файл:

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

Затем вы пишете в файл:

fwrite($fp, $body);

И не забудьте закрыть файл, чтобы избежать утечки памяти:

fclose($fp);

Наконец, вам просто нужно конвертировать файл по вашему усмотрению. Просто помните, что режим 'x' в fopen () создает файл и возвращает ошибку, если файл с таким именем уже существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...