@Kerm

Как скачать изображение по FTP ссылке? FTP server reports 550 Permission denied?

Попался поставщик у которого ссылки на картинки товаров идут такого вида:

ftp://78.140.160.199/foto/stol-latte-big-01.jpg

Если в браузере перейти по ссылке, то начинается скачка картинки,

Написал скрипт:

<?php

$file = file_get_contents('images.txt');

$images = explode("\n", $file);

$i = 0;
foreach ($images as $image) {
	$i++;
	echo "image number:" .$i;

	$foto = file_get_contents(trim($image));

	if ($foto) {
		file_put_contents('images/'.$image, $foto);
	} else {
		file_put_contents('images_error.txt', $image);
	}
}


Получаю ошибку:

Warning: file_get_contents(ftp://78.140.160.199/foto/frappe_kreslo_01.jpg): failed to open stream: FTP server reports 550 Permission denied in...

Прошу помочь.
  • Вопрос задан
  • 441 просмотр
Решения вопроса 1
@Kerm Автор вопроса
Сделал рабочий скрипт, если кому интересно:

<?php
declare(strict_types=1);
error_reporting(E_ALL);
ini_set('display_errors','1');


function grab_image($url, $saveto){
    if (file_exists($saveto)){
        unlink($saveto);
    }

    $fp = fopen($saveto, 'w+b');
    if (false === $fp) {
        throw new RuntimeException ( 'fopen() failed.   last error: ' . return_var_dump ( error_get_last () ) );
    }

    $ch = curl_init($url);
    if (false === $ch) {
        throw new RuntimeException ( 'curl_init() failed.   last error: ' . return_var_dump ( error_get_last () ) );
    }

    ecurl_setopt($ch, CURLOPT_URL, $url);
    ecurl_setopt($ch, CURLOPT_FILE, $fp);
    ecurl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    ecurl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    ecurl_setopt($ch, CURLOPT_TIMEOUT, 30);
    ecurl_setopt($ch, CURLOPT_VERBOSE, 1);
    ecurl_setopt($ch, CURLOPT_STDERR, $fp);

    ecurl_exec($ch);
    curl_close($ch);

    fclose($fp);
}

$file = file_get_contents('images.txt');
$images = explode("\n", $file);
$i = 0;

foreach ($images as $image) {
    $i++;

    $image = str_replace(" ","%20", trim($image));

    echo "image number: " .$i. "<br>";

    $fileName = explode('/', $image);
    end($fileName);
    $key = key($fileName);

    $fp = 'images/'.$fileName[$key];
    grab_image($image, $fp);
}

function ecurl_setopt ( /*resource*/$ch , int $option , /*mixed*/ $value ):bool{
    $ret=curl_setopt($ch,$option,$value);
    if($ret!==true){
        //option should be obvious by stack trace
        throw new RuntimeException ( 'curl_setopt() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return true;
}
function ecurl_exec ( /*resource*/$ch)/*:mixed depending on CURLOPT_RETURNTRANSFER*/{
    $ret=curl_exec($ch);
    if($ret===false){
        throw new RuntimeException ( 'curl_exec() failed. curl_errno: ' . return_var_dump ( curl_errno ($ch) ).'. curl_error: '.curl_error($ch) );
    }
    return $ret;
}


function return_var_dump(/*...*/){
    $args = func_get_args ();
    ob_start ();
    call_user_func_array ( 'var_dump', $args );
    return ob_get_clean ();
}


Ссылки на картинки находятся в txt файле, каждая ссылка на новой строке.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
wget ftp://78.140.160.199/foto/stol-latte-big-01.jpg спокойно скачивает этот файл.
То есть авторизации и юзерагенты, скорее всего, вообще ни при чем.
Возможно, блокируется адрес, с которого вы тянетесь. АнтиДДоСом, например.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы