Копирование изображений из списка URl на мой сервер одновременно по php

0

У меня есть большой список Urls в html файле для изображений примерно так:

<a href="http://example.com/image1.jpg">image1</a>
<a href="http://example.com/image2.jpg">image2</a>
<a href="http://example.com/image3.jpg">image3</a>
<a href="http://example.com/image4.jpg">image4</a>
<a href="http://example.com/image5.jpg">image5</a>
<a href="http://example.com/image6.jpg">image6</a>
<a href="http://example.com/image7.jpg">image7</a>

Около 50 000 изображений

Я хочу сделать небольшой скрипт, который может скопировать все изображения на мой сервер, чтобы я мог их использовать:

http://Mywebsite.com/images/image1.jpg
http://Mywebsite.com/images/image1.jpg
http://Mywebsite.com/images/image1.jpg
...

Я хочу сделать цикл, и каждый Url в списке должен быть удален после того, как изображение будет скопировано успешно, потому что иногда, если страница разбивается при загрузке или что-то, я могу продолжить цикл без перезаписывания или чтения снова, если есть лучшее решение, чтобы не перезаписывать и прочитайте url снова, пожалуйста, скажите мне.

  • 0
    Мне не совсем понятно, о чем ты спрашиваешь. Может помочь, если вы написали «маленький скрипт», и тогда мы сможем решить проблемы с ним.
  • 0
    Я новичок в php. Я еще не создал ни одного скрипта. См. Например, я хочу, чтобы скрипт перешел на Url-list.html и скопировал image1 на мой сервер, затем image2, затем image3 и так далее.
Показать ещё 2 комментария
Теги:
loops

2 ответа

0
Лучший ответ

Я бы создал скрипт, который читает вашу строку html файла в строке.
Вы можете сделать это с помощью fopen и fgets.

fopen("path/to/some/file", "r");
while ( ( $line = fgets( $handle ) ) !== false ) 
{
    // do somehting with $line
}

Таким образом, файл не просто анализируется в памяти, поэтому вам не нужно беспокоиться о размере

Затем после разбора каждой строки я записываю файл блокировки, содержащий текущий номер строки/индекс. Поэтому, если ваш скрипт сработает и вы перезапустите его, итерация просто пропускает каждую строку, пока текущий индекс не станет выше индекса из файла блокировки.

сценарий

Это может сработать, но, в конце концов, не следует просто копировать все. Но я надеюсь, что это поможет вам найти решение.

#!/usr/bin/env php
<?php
// I DID NOT TEST THIS! 
// but it should work.

$handle = fopen("path/to/the/html/file/containing/the/urls.html", "r");
$storage = "path/where/you/want/your/images/";
$lockFile = __DIR__.'/index.lock';
$index = 0;

// get the lock index
if ( !file_exists( $lockFile ) )
{
    file_put_contents( $lockFile, 0 );
}

// load the current index
$start = file_get_contents( $lockFile );

if ( $handle ) 
{
    // line by line step by step
    while ( ( $line = fgets( $handle ) ) !== false ) 
    {
        // update the 
        $index++;

        if ( $start > $index )
        {
            continue;
        }

        // match the url from the element
        preg_match( '/<a href="(.+)">/', $line, $url ); $url = $url[1];

        $file = basename( $url );

        // check if the file already exists 

        if ( !file_exists( $storage.$file )) //edited 
        {
            file_put_contents( $storage.$file, file_get_contents( $url ) );
        }

        // update the lock file
        file_put_contents( $lockFile, $index );
    }

    fclose($handle);
} 
else 
{
    throw new Exception( 'Could not open file.' );
} 
  • 0
    Вы гораздо более амбициозны, чем я, но это сильный толчок в правильном направлении.
  • 0
    Да, это именно то, что я ищу .. 1 вопрос о том, сколько времени потребуется, чтобы скопировать изображения размером 50 КБ. Допустим, 1 изображение = 1 МБ. Потому что я бы предпочел загрузить все изображения по программе и загрузить, но это занимает время, так что Быстрее ? .. и спасибо за вашу большую помощь, я действительно ценю это ..
Показать ещё 2 комментария
0

вы можете сделать что-то вроде этого, конечно, вы также должны добавить здесь некоторые ошибки проверки вещей :)

define("SITE_DIR", '/home/www/temp');

$file = file('in.txt');

foreach ($file AS $row){
    preg_match('/(?<=\")(.*?)(?=\")/', $row, $url);

    $path = parse_url($url[0], PHP_URL_PATH);
    $dirname = pathinfo($path, PATHINFO_DIRNAME);

    if (!is_dir(SITE_DIR . $dirname)){
        mkdir(SITE_DIR . $dirname, 0777, true);
    }

    file_put_contents(SITE_DIR. $path, file_get_contents($url[0]));
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню