Autor Zpráva
boss
Profil *
Dobrý den, chci se zeptat jestli se dá zjistit pomocí php existence souboru na jiné doméně. Děkuju
fuckin
Profil
Ano, zjistíš si hlavičku a dle ní poznáš zda existuje.
boss
Profil *
Jak zjistim hlavičku?
nightfish
Profil
http://cz.php.net/get_headers
boss
Profil *
Hmm, pěkný :-) nešlo by to jednodušeji?
boss
Profil *
Nebo slo by jen zjistit text? Jestli existuje třeba slovo "EUR 24"
Mastodont
Profil
boss:
A proč, když stačí hlavičky?
boss
Profil *
Bohužel tohle nefunguje.
$url = 'http://static.php.net/www.php.net/images/php.gif';
if(!empty(get_headers($url))){
  echo 'existuje';
}
mckay
Profil
boss:
Vypiš si, co vlastně vůbec v tom get_headers(); přijímáš.

print_r(get_headers($url));
fuckin
Profil
Tak hlavička není nikdy prázdná.

Když soubor neexistuje vrátí 404. Takže testovat zda to nic nevrátí je blbost.
DoubleThink
Profil *
fuckin:
Tak hlavička není nikdy prázdná.
Kromě situace, kdy cílový server neodpoví. Pak je hodnota get_headers FALSE a tím pádem empty TRUE.
boss
Profil *
Kdyz neni nikdy prazdna, tak jak mám tedy sestavit podminku? Děkuju
__construct
Profil
Pokiaľ sa na servery používa mod_rewrite tak pri takomto presmerovaní (dosť bežné):
RewriteCond $1 !^(index\.php|(.*)\.(css|js|txt|xml)) #atď
RewriteRule ^(.*)$ index.php/$1 [L]

to nemusí správne fungovať
boss
Profil *
Hmm, tak pořád, ale nevím jak zjistit existenci souboru :-(
__construct
Profil
Toto som skúšal a funguje to, ale som Ti už písal, mod_rewrite to oblbuje..
<?php
$image = "http://nejaka-adresa.tld/subor.txt";
$handle = @fopen($image, "r");
if(strpos((string)$handle, "Resource id") !== false){
    echo "Existuje";
}else{
    echo "Neexistuje";
}
?>
boss
Profil *
JJ, tohle fachá :-) Jistější proces neni? Tohle je super, ale když se to dá oblbnout, tak se jen chci zeptat jak tomu předejít.
Mastodont
Profil
fopen ovšem nebude fungovat, pokud je v php.ini vypnuto allow_url_fopen ...
Jan Tvrdík
Profil
boss:
Hmm, tak pořád, ale nevím jak zjistit existenci souboru :-(
function url_exists($url)
{
    $headers = @get_headers($url);
    return ($headers && preg_match('#^HTTP\/\d\.\d\s+(200|301|302)#', $headers[0]));
}
AM_
Profil
[#13] __construct: tomu se ale nijak triviálně vyhnout nedá, ne? server se pak tváří, že ten soubor prostě existuje (většinou je to dokonce žádoucí, že) a pokud při chybějícím souboru toto nedá vědět v hlavičce, je to chyba daného serveru/aplikace a je třeba ji řešit individuálně.

boss:
Jistější proces neni?
mnohem elegantnější a jistější je get_headers(), je opravdu tak těžké si přečíst manuál a podívat se, co funkce vrací? poznáš to podle první hlavičky, pokud obsahuje 200, soubor existuje, pokud 404, soubor neexistuje, pokud něco jiného, došlo k nějakému specifickému stavu (přesměrování, chyba autentizace atd...) a ten se musíš rozhodnout, jak vyhodnotíš
Miguelos1981
Profil
Viz třída:
 class UrlExists {
 	
 	public function __construct($url) {
 		$this->url = trim($url);
 	}
 	
 	/**
 	 * metoda kontroluje existenci url
 	 */
 	public function httpExistance($url) {
		return (($fp = @fopen($url, 'r')) === false) ? false : @fclose($fp);
	}
 	
	/**
	 * metoda vraci info o (ne)zadane url adrese a existenci souboru na url
	 */ 	
 	public function getUrlInfo() {
 		// kontrolujeme zda jsem vyplnili url
 		if(empty($this->url)) {
 			$status['userMsg'] = 'Nezadali jste URL adresu.';
 			$status['url'] = false;
 		} else {
                        // kontrolujeme existenci
 			if(!$this->httpExistance($this->url)) {
	 			$status['userMsg'] = 'Vámi zadaná URL neexistuje.';
	 			$status['url'] = false;
	 		} else {
	 			$status['userMsg'] = 'Vámi zadaná URL je v pořádku.';
	 			$status['url'] = true;
	 		}			
 		}
 		return $status;
 	}	
 }

v kódu to pak voláme následovně:

$url = '...... tvoje url .........';

$UrlExists= new UrlExists($url);	
$statusUrl = $UrlExists->getUrlInfo();
	
var_dump($statusUrl);

 if($statusUrl['url']) {
	print 'vse ok';
 } else {
        print 'asi je neco blbe a url je spatne';
}

omlouvám se za formátování, ale začínám na tomhle fóru, tak mi to moc nejde :-D
haba
Profil
Miguelos1981:
Ahoj, na tento problém jsem také narazil. Bohuzel fopen(); je limitován nastavením velikosti paměti v php.ini, tzn. pokud je kontrolovaný soubor větší než nastavená paměť v php.ini tak mi to nefungovalo. Musel jsem nakonec celý problém řešit přez kontrolu existence přez FTP funkce, což samozřejmně nejde použít vždy. Takže pokud někdo má zkušenost jak bez použití funkcí pro práci přez ftp, nebo ssh2.ftp (atp.) tak prosím pište.
Moje situace je taková, že podle uživatelova zadání kontroluji existenci video souborů (běžně o velikostech okolo 100MB) na vzáleném stream serveru.
Keeehi
Profil
Podívej se na odkaz v příspěvku [#4]. Funkce get_headers by měla řešit tvůj problém.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0