Проблема с именем файла, содержащим пробелы - PullRequest
0 голосов
/ 12 июня 2018

В OpenCart Framework версии 3.0.2.0 есть ошибка,

Если есть файлы с именами, содержащими пробелы между ними, обработка и выполнение занимает слишком много времени

Например,: Рассмотрим

img = https://DomainNameServer/image/catalog/pimages/SKU 081985 P80.jpg

<?php

set_time_limit(0);
ignore_user_abort(true);

public  function addSubImages($images){    
      $Image =array();

      foreach($images['img'] as $key => $img){

          $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
          $headers[] = 'Connection: Keep-Alive';         
          $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
          $user_agent = 'php';         
          $process = curl_init($img); // http://localhost/bluemb/image/catalog/pimages/SKU 081985 P80.jpg    
          curl_setopt($process, CURLOPT_HTTPHEADER, $headers);         
          curl_setopt($process, CURLOPT_HEADER, 0);         
          curl_setopt($process, CURLOPT_USERAGENT, $user_agent);
          curl_setopt($process, CURLOPT_TIMEOUT, 1800);   
          curl_setopt($process, CURLOPT_CONNECTTIMEOUT, 0); 
          //curl_setopt($process, CURLOPT_CONNECTTIMEOUT, 1700); 
          curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);         
          curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);         
          $return = curl_exec($process);         
          curl_close($process);         
          //return $return;  

          $filepath  = pathinfo($img);
          $dirname  = DIR_IMAGE.'catalog/prod/';

          if (!file_exists($dirname)) {
            mkdir($dirname, 0755, true);
          } 

          if (!empty($dirname)) {
            $srcfile = $img;
            $dstfile = DIR_IMAGE.'catalog/prod/'.$filepath['basename']; // /var/www/html/opencart/image/catalog/prod/SKU 081985 P80.jpg
            $Image[] = 'catalog/prod/'.$filepath['basename'];  //catalog/prod/SKU 081985 P80.jpg
            copy(str_replace(" ","%20",$srcfile), $dstfile);
            //file_put_contents($dstfile,$return);
          } 
          else {
            $Image = "";
          }

      }      
  return $Image;
}

С этими функциями ниже:

  1. Изображения были сохранены в формате Corrupted / RAW с большей задержкой без пропускной способности file_put_contents($dstfile, $return);

  2. Изображения были сохранены идеально с большей задержкой справильная пропускная способность copy(str_replace(" ", "%20", $srcfile), $dstfile);

  3. Изображения были сохранены в текстовом формате с большей задержкой при неправильной пропускной способности @copy($srcfile, $dstfile); $content = file_get_contents($srcfile); $fp = fopen($dstfile , "w+"); fwrite($fp, $content); $Image = 'catalog/prod/'.$filepath['basename']; fclose($fp); curl_close($process);

  4. copy(urlencode($srcfile), $dstfile);

    Результаты:

    Предупреждение : копия (https% 3A% 2F% 2Fwww.DomainNameServer.в% 2Fimage% 2Fcatalog% 2Fpimages% 2FSKU093126 +% 281% 29.jpg): не удалось открыть поток: нет такого файла или каталога в / var / www / html / opencart3 / admin / model / account / apisync.php on line 264

  5. copy(urldecode($srcfile), $dstfile);

    Результаты:

    Предупреждение : копия (https://www.DomainNameServer.in/image/catalog/pimages/SKU093126 (1) .jpg): не удалось открыть поток: сбой HTTP-запроса!в / var / www / html / opencart3 / admin / model / account / apisync.php on line 264

  6. copy(str_replace('_','%20',$srcfile), $dstfile);

    Результаты:

    Предупреждение : копия (https://www.DomainNameServer.in/image/catalog/pimages/SKU093126 (1) .jpg): не удалосьоткрытый поток: HTTP-запрос не выполнен!в / var / www / html / opencart3 / admin / model / account / apisync.php on line 265

  7. copy(str_replace('%20',' ',$srcfile), $dstfile); ИЛИ copy(str_replace('%20','_',$srcfile), $dstfile); ИЛИ copy(str_replace('%20','',$srcfile), $dstfile);

    Результаты:

    Предупреждение : копия (https://www.DomainNameServer.in/image/catalog/pimages/SKU093126 (1) .jpg): не удалось открыть поток: ошибка HTTP-запроса!в / var / www / html / opencart3 / admin / model / account / apisync.php on line 265


При создании функциональности API из 10 000 продуктов только 1091 продукт сохраняется в базе данных, а остальные 8909 продуктов занимали 7 - 10 часов.Так как я установил лимит времени выполнения на бесконечность.Когда я проверил через 10 часов, все продукты были успешно сохранены.

Общее время выполнения прямо пропорционально нет.имени файла изображения с пробелами

Экспорт №.продукта зависит от имени файла изображения, содержащего пробелы.Когда я выполнял отладку для трех продуктов с именем файла изображения с пробелами, потребовалось 20 минут, чтобы завершить работу без функции addSubImages(), для выполнения

не потребовалось ни одной секунды.подходы к решениям, чтобы обойти этот сценарий?

1 Ответ

0 голосов
/ 12 июня 2018

Используйте этот код. Не используйте пробел

copy(str_replace("%20", "", $srcfile), $dstfile);
OR 
copy(str_replace("%20", "_", $srcfile), $dstfile);

См. https://www.w3schools.com/php/func_string_str_replace.asp

...