Problem Z pobraniem zdjęcia po FTP

1

Witam serdecznie wszystkich specjalistów PHP.
Zwracam się z prośbą o pomoc, a za razem z pytaniem. Czy coś takiego jest w ogóle możliwe?
Na wstępie opisze o co mi chodzi i czego potrzebuje, aby uniknąć dodatkowych pytań.

Mam trzy kamery, które są administrowane przez zewnętrzną firmę, kamery co minute robią zdjęcie, które zapisywane jest na serwerze właściciela kamer. Chciał bym publikować zdjęcia w formie krótkiego filmiku (przegląd ostatnich 24 godzin) na własnej stronie internetowej. Mechanizm do filmu mam i działa, po wgraniu zdjęć do odpowiednich katalogów, skrypt wykonuje montaż i można obejrzeć w 40 sekund ostatnie 24 godziny pogodę i stan lotniska.

No i tu zaczynają się problemy, nie jestem w stanie pobrać zdjęć z serwera po FTP na własny serwer (Komunikat: Plik nie istnieje).
Otrzymałem zgodę i dostęp do katalogów przez FTP, gdzie zapisywane są zdjęcia.
Moje założenia są takie:

  1. Skrypt odpalany jest co 5 minut, przez cron-a i loguje się na serwerze.
  2. Po zalogowaniu, sprawdza ostatni zapisany plik.
  3. Pobieram go do wskazanego prze zemnie katalogu.
  4. Podczas zapisu zmieniam jego nazwę.
    Poniżej moje wypociny...
<?php
	$ftp = "domena.pl";
	$ftp_port = "1111";
	$uzytkownik = "login:-)";
	$haslo = "haslo:-(";

	echo "<p>Laczenie z $ftp</p>";

	if ( $polaczenie = ftp_connect( $ftp ) ) {

		echo "<p>Polaczono z $ftp</p>";

		if ( ftp_login( $polaczenie, $uzytkownik, $haslo ) ) {
			
			$pliki = ftp_nlist( $polaczenie, '/sciezka/katalogu/docelowego/' );
			foreach ( $pliki as $plik )
				echo "<p>.$plik.</p>";

			// otwarcie katalogu ze zdjęciami
			$data = date( "Ymd" );
			$godz = date( "His" );
			$nazwa = 'WspolnaNazwaDlaPliku';
			$kam1link = "MojKatalog/" . $nazwa . "_" . $data . "_" . $godz . "M";

			if ( $handle = opendir( $polaczenie ) ) {
				while ( false !== ( $file = readdir( $handle ) ) ) {
					if ( is_file( $polaczenie . '/sciezka/katalogu/docelowego/' . $file ) && ( ( $kiedy = filemtime( $polaczenie . '/sciezka/katalogu/docelowego/' . $file ) ) > $najnowszy ) ) {
						$najnowszy = $kiedy;
						$najnowszy_nazwa = $file;
					}
				}
				closedir( $handle );
			}

			// zapisanie i zamiana nazwy pliku na docelowym serwerze
			$size = getimagesize( $polaczenie . '/sciezka/katalogu/docelowego/' . $najnowszy_nazwa );
			$fp = fopen( $polaczenie . '/sciezka/katalogu/docelowego/' . $najnowszy_nazwa, "rb" );

			if ( $size && $fp ) {

				$contents = file_get_contents( $polaczenie . '/sciezka/katalogu/docelowego/' . $najnowszy_nazwa );
				$fp = fopen( "$kam1link.jpg", 'w' );

				fwrite( $fp, $contents );
				fclose( $fp );

				echo '<p>Plik pobrano</p>';

			} else {

				echo '<p>Plik nie istnieje</p>';
			}
			echo '<p>Najnowszy plik to: ' . $najnowszy_nazwa . ', bo z dnia: ' . date( "M-d-Y G:i:s", $najnowszy ) . '</p>';
			include '$najnowszy';

		} else {
			echo "Nie mozna zalogowac uzytkownika $uzytkownik do serwera $ftp";
			ftp_close( $polaczenie );
		}
	} else {
		echo "Nie mozna polaczyc się z serwerem $ftp";
	}
	?>

Skrypty sprawdzałem i działają, ale w odpowiednich warunkach. Połączenie FTP działa i loguje się na serwerze. Jeśli chodzi o pobranie pliku też dział, ale jak chcę pobrać plik z serwera, na którym znajduje się skrypt ( z katalogu a1/ do katalogu b1/).
W momencie kiedy chcę połączyć oba mechanizmy i chcę pobrać plik po FTP (z katalogu domena.pl/sciezka/katalogu/docelowego/ do katakogu MojKatalog/), jest klop :-(.

Ktoś coś Poradzi?

Drobna trudność – a może i nie, serwer, na której jest moja strona posiada interproter PHP5.

1

Może to kwestia FXP, a raczej kwestia jego braku (chociaż nie jestem pewien czy w Twoim przypadku FXP byłoby wykorzystane).

Anyway.... Podziel kod na mniejsze kawałki, opakuj co nieco w małe, lecz sprawne funkcje. Obecnie dosyć ciężko się to czyta.

0

Problem moim zdaniem tkwi w instrukcjach typu opendir albo fopen które są do działania na plikach LOKALNYCH nie zdalnych. Zmienna $polaczenie nie może być używana przez te funkcje. Musisz uzyć funkcji ftp do pobrania pliku z serwera, co więcej, z tego co pamiętam, kiedy będziesz przechodził do kolejnych katalogów używając ftp_chdir, musisz to robić przez pojedyncze katalogi, czyli dla ścieżki /jakaś/ściezka/do/katalogu/PLIK musisz użyć ftp_chdir cztery razy: dla "jakaś", "ścieżka", "do", "katalogu". Do pobrania pliku używasz finalnie funkcji ftp_fget. Tutaj cały manual: http://php.net/manual/en/book.ftp.php

0

Proponuję użyć komponentu Symfony: Finder Component
Komponenty symfony możesz bez problemu używać jako normalnych zależności (bibliotek) bez samego frameworka. ;)
Jak wczytasz się w dokumentację to zobaczysz, że za pomocą tego komponentu możesz łatwo przeszukiwać wskazany katalog na ftp w poszukiwaniu plików.
Co więcej bez problemu możesz filtrować pliki określając zakres rozmiaru plików, datę utworzenie, wzór nazwy, itp.
Moim zdaniem super narzędzie do Twoich wymagań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1