2015-12-04 9 views
1

После вашей помощи, много сообщений stackoverflow, решение находится внизу этого сообщения как ОБНОВЛЕНИЕ.Сохранить изображения с URL-адреса с переменной

Я пытаюсь сохранить некоторые изображения автоматически с помощью этого кода в PHP файле:

for ($num1=100;$num1<999;$num1++) 
{ 
    for ($num2=100;$num2<999;$num2++) 
    { 
     $postURL = "http://link_00000'.$num1.'_'.$num2.'.jpg"; 
     $ch = curl_init('http://link_00000'.$num1.'_'.$num2.'.jpg'); 
     $fp = fopen($postURL, '/path/Apolo/img/'.$num1.'_'.$num2.'.jpg', 'wb'); 
     curl_setopt($ch, CURLOPT_FILE, $fp); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_exec($ch); 
     curl_close($ch); 
     fclose($fp); 
    } 
} 

Первый вопрос:

$num1 и $num2 должна начинаться от 000 до 999, а не от 0 до 999. Помещение большего числа $num переменных ($num3, $num4 ...) было бы решением, но я полагаю, что для ди мерзавцы.

Второй вопрос:

Изображения не сохраняются. Я попробовал этот, как хорошо, но это не сработало:

copy($postURL, '/path/img/'.$num1.'_'.$num2.'.jpg');

Третий вопрос:

Как я могу предотвратить действие, как d-дос атаки? Если я загружу ссылки без задержки, возможно, веб-сайт будет недоступен.


UPD:

for ($num1=000;$num1<999;$num1++) 
{ 
    for ($num2=000;$num2<999;$num2++) 
    { 
     $url = 'http://link.com/00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg'; 
     echo ''.$num1.'_'.$num2.''; 
     echo "\n"; 
     if (@getimagesize($url)) \\ checks if url-image exists 
     { 
      echo $url; 
      $ch = curl_init($url); 
      $fp = fopen('/path/Apolo/00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg', 'wb'); 
      curl_setopt($ch, CURLOPT_FILE, $fp); 
      curl_setopt($ch, CURLOPT_HEADER, 0); 
      curl_exec($ch); 
      curl_close($ch); 
      fclose($fp); 
      sleep(1); //1 second delay to avoid d-dos 
     } 
    } 
} 
+0

Посмотрите на примеры того, как обращаться с циклом for: http://php.net/manual/en/control-structures.for.php – swidmann

+0

Вы ошибочно связываете переменные в значении '$ postURL' , Попробуйте использовать одиночные кавычки как разделители строк, а не двойные. – D4V1D

+0

Почему вы в конечном итоге использовали решение с большим количеством циклов и nums вместо того, чтобы просто использовать 'sprintf («% 03d », $ num1)', который автоматически добавляет ваши ведущие нули. – uruloke

ответ

2

Когда вы имеете дело с целыми числами, вы не можете сказать, 000, так как это значение равно 0, если вы хотите, чтобы написать 000, то вы должны использовать строку вместо.

В вашем примере вы перебираете числа, поэтому запись его в виде строк будет беспорядочной, если вы не будете ее зацикливать.
Therefor лучшее решение было бы просто добавить ведущих 0-х себя, это можно сделать так:
sprintf("%03d", $num1);

Это автоматически добавит водительства нули, что вы хотели.

UPDATE 1: (забыл ответить на сохранить изображение)

Для сохранения изображения, которые вы можете сделать это следующим образом:
file_put_contents('/path/Apolo/img/filename'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg', file_get_contents($postURL));

Update 2: (код примера):

for ($num1=100;$num1<999;$num1++) 
    for ($num2=100;$num2<999;$num2++){ 
     $postURL = 'http://link_00000'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg'; 
     $path = '/path/Apolo/img/filename'.sprintf("%03d", $num1).'_'.sprintf("%03d", $num2).'.jpg'; 
     file_put_contents($path, file_get_contents($postURL)); 
} 

Вопрос 3:

Там много способов t o предотвратите атаки DDOS, но если вы просто не сможете быстро запустить свой сайт и предотвратить/обработать DDOS-атаки, тогда измените свой DNS на cloudflare, он того стоит, и их бесплатная учетная запись вам больше подходит.

+0

Я могу сохранить изображение с моим кодом, когда я не использую переменные. Кроме того, я использую IF с (@getimagesize ($ url)) раньше. Этот не работает. Должен ли я загружать библиотеку раньше? –

+0

getimagesize должен иметь полный URL-адрес, включая «http: //». С этим он работает. –

+0

Извините, я написал что-то неправильно в 'file_put_contents', я забыл добавить полное имя файла. Просто обновил мой пост – uruloke