Newsgroup: it.comp.www.php
Titolo: download di un file zip con uno script PHP

Sto impazzendo cercando di fare il download di un file zip utilizzando
uno script php.
Sto cercando di ottenere uno stream HTML e salvarlo in un file.
Penso che il problema è che nel file che salvo sul disco vengono
inclusi anche gli header HTTP, ma non ne sono sicuro.  In ogni caso il
file che viene salvato è leggermente più piccolo di quello scaricato
da internet e non si riesce a processare con WinZip.
Qualcuno sa come risolvere il problema, oppure in generale come
effettuare un download tramite uno script?
Questo lo script che ho provato ad usare:
$rdf = parse_url($remotefile);
$fp = fsockopen($rdf['host'], 80, $errno, $errstr, 240);
if ($fp) {
	fputs($fp, "GET " . $rdf['path'] . " HTTP/1.1\r\n");
	fputs($fp, "HOST: " . $rdf['host'] . "\r\n\r\n");
	fputs($fp, "Content-Type: application/zip\r\n");
	while(!feof($fp)) {
		$pagetext = fgets($fp,4096);
		$data_text .= chop($pagetext);
	}
	fputs($fp,"Connection: close\r\n\r\n");
	fclose($fp);
} else {
	echo "Problemi ... ";
}
$fpw = fopen($filepathlocal, "w");
$res = fwrite($fpw, $data_text);
fclose($fpw);

abon...@gmail.com
 ha scritto:
{kut}
io invece sapevo:
// SE IL BROWSER È INTERNET EXPLORER
if(ereg("MSIE ([0-9].[0-9]{1,2})", $_SERVER["HTTP_USER_AGENT"])) {
header("Content-Type: application/octetstream");
header("Content-Disposition: inline; filename=$name");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Pragma: public");
} else {
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=$name");
header("Expires: 0");
header("Pragma: no-cache");
}
echo $data;
dove data e' uno stream tipo quando carichi una cella binaria da my sql
ma credo che funzioni anche con fopen. Poi devi linkare questa pagina
da un'altra. Magari fai un case dove ad un nome dato in imput la pagina
punta in automatico ad un file.
spero di averti aiutato
ciao

 effettuare un download tramite uno script?
...usa qualcosa del genere con fsockopen(). Ovviamente aumenta i tempi 
di esecuzione dello script php (ini/cfg max_execution_time) se il 
download e' lungo.
(Scritta al volo e non testata abbastanza. Quindi provala per bene, 
adattala e, magari, metti il codice dentro ad una funzione)
ciao
<?php
function esci_errore($s) // stub
{	printf("-- %s\n", $s);
	exit();
}
// parametri dello script
$sFileOut = "/tmp/testfile.zip";
$sHostName = "www.host.ext";
$sUriPath = "/download/pippo.zip";
$nOpenStreamTimeOut = 45; # secondi timeout nella connect
$nReadTimeOut = 30; # secondi timeout in lettura
// -----------------
if(!($fp = @fsockopen($sHostName, 80, $nErrno, $sErrstr, 
$nOpenStreamTimeOut)))
{	$sErrMsg = sprintf("Non posso aprire il socket per l'host: %s", 
$sHostName);
	if($nErrno)
		$sErrMsg .= " - Errore $nErrno: $sErrstr";
	esci_errore($sErrMsg);
}
$sHttpRequest  = sprintf("GET %s HTTP/1.0\r\n", $sUriPath);
$sHttpRequest .= "User-Agent: Mio Scarica Roba 1.0\r\n"; # per 
correttezza si annuncia :)
$sHttpRequest .= sprintf("Host: %s\r\n", $sHostName);
$sHttpRequest .= "\r\n";
$nHttpReqLen = strlen($sHttpRequest);
if (fputs($fp, $sHttpRequest, $nHttpReqLen) != $nHttpReqLen)
{	@fclose($fp);
	esci_errore("Connessione chiusa anticipatamente dal server.");
}
stream_set_timeout($fp, $nReadTimeOut);
$nHttpResCode = 0;
$sHttpResMsg = '';
for($i = 0; !feof($fp); )
{	$s = fgets($fp, 0x1000);
	$sHdrLine = trim($s);
	if($i == 0)
	{	if($sHdrLine == '')
			continue; // non dovrebbe... ma...
		if(!preg_match("~^HTTP/[0-9.]+\s+([0-9]+)\s+(.*)$~", $sHdrLine, $aReg))
			break;
		$nHttpResCode = (int)$aReg[1];
		$sHttpResMsg = trim($aReg[2]);
	}
	else if ($sHdrLine == "")
		break;
	$i++;
}
if($nHttpResCode != 200)
{	if($nHttpResCode <= 0)
	{	$nHttpResCode = -1;
		$sHttpResMsg = "Errore di risposta del server";
	}
	$sErrMsg = "Richiesta HTTP fallita. $nHttpResCode: $sHttpResMsg";
	@fclose($fp);
	esci_errore($sErrMsg);
}
if(!($fpOut = fopen($sFileOut, "w")))
{	@fclose($fp);
	esci_errore("Non posso scrivere il file.");
}
while(!feof($fp))
{	$sData = fgets($fp, 0x4000);
	if($sData === false)
	{	@fclose($fpOut);
		@fclose($fp);
		esci_errore("Errore di lettura socket.");
	}
	if(fwrite($fpOut, $sData) === false)
	{	@fclose($fpOut);
		@fclose($fp);
		esci_errore("Errore di scrittura file.");
	}
}
if(!fclose($fpOut))
	esci_errore("Errore di scrittura file (flush).");
fclose($fp);
echo "-- OK: $sFileOut --\n";
?>
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

 $nOpenStreamTimeOut)))
...ovviamente, si poteva ottenere un risultato simile anche usando 
funzioni + semplici come:
- fopen("
http://www.host.ext/path/file.zip
", "rb")
- file_get_contents("
http://www.host.ext/path/file.zip
")
...pero', nel primo caso hai meno possibilita' di fare controlli (eg. 
sugli headers di risposta) e, nel secondo caso, sei costretto a caricare 
tutto il file in memoria.
ciao


 if(!($fpOut = fopen($sFileOut, "w")))
if(!($fpOut = fopen($sFileOut, "wb"))) // ...per chi usa Windows :)


 }
scusatemi
ciao
(meglio che non faccia piu' post nelle notti insonni)


Grazie mille!!
ho usato file_get_contents()
Angelo
Cybertoldo ha scritto:
