HTTP wrapper does not support writeable connections

13 contenuti / 0 new
Ultimo contenuto
HTTP wrapper does not support writeable connections

So che sono leggermente OT perchè il problema che sto sottoponendo alla vostra attenzione non è legato propriamente a Drupal ma al PHP ma sto realizzando un sito drupal che prevede anche l'uso di PHP e voi siete una community molto attiva e presente e son sicuro che qualcuno saprà aiutarmi...
Premetto che tutto quello che voglio fare qua sotto in locale funzionava...

Sto cercando di recuperare un foglio XML dal server di un gestionale e di sovrascrivere un file che ho sul database sul mio server (Aruba, linux).
Il codice php che fa la cosa è il seguente:

Quote:
[CODE]
//RECUPERO IL FOGLIO XML DAL SERVER FTP
//Connessione al server ftp
$ftp_host = 'www.hostgesionale.it';
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
//Login al server ftp
$username = 'miousersulgestionale';
$pwd = 'miapasssulgestionale';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
//recupero del file
$destination_file = "http://www.miosito.it/aggiornamento/studenti.xml";
$source_file = "/file.xml";
[B]ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");[B]
//Chiusura della connessione al server ftp
ftp_quit($connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
[/CODE]

Però quando eseguo il php mi da questo errore:

Quote:

Warning: ftp_get(h*tp://www.miosito.it/aggiornamento/studenti.xml): failed to open stream: HTTP wrapper does not support writeable connections in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Warning: ftp_get(): Error opening [CODE]http://www.miosito.it/aggiornamento/studenti.xml[CODE] in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29
Errore durante il recupero del file dal server ftp

(dove la frase "Errore durante il recupero del file dal server ftp" è scritta dal mio codice...)
la riga 29 è quella che ho messo in grassetto dove ho "ftp_get"

I possibili errori che mi vengono in mente sono questi:
1. non devo mettere $destination_file = "h*tp://www.miosito.it/aggiornamento/studenti.xml"; ma $destination_file = "f*p://[email protected]@ftp.miosito.it/www.miosito.it/aggiornamento
/studenti.xml";

2. cambiare i permessi dei file php e xml da 755 a 777 (anche se quando ho settato a 777 mi dava INTERNAL ERROR)

3. Ho fatto l'accesso al server prima di connettermi al server del gesionale, potrebbe essere un problema?

Io non sono un mago del php, qualcuno sa quindi dove sto sbagliando?

Mi sembra che stai girando quel script (/web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php[/codefilter_...) sul server di destinazione - il tuo sito Drupal.
In quel caso il valore di $local_file in ftp_get si riferisce a /web/htdocs/www.miosito.it/[/codefilter_code] quindi è sufficiente specificare
$destination_file = "/aggiornamento/studenti.xml";

HTH

John

Più imparo, più dubito.

jhl.verona wrote:
Mi sembra che stai girando quel script (/web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php[/codefilter_...) sul server di destinazione - il tuo sito Drupal.
In quel caso il valore di $local_file in ftp_get si riferisce a /web/htdocs/www.miosito.it/[/codefilter_code] quindi è sufficiente specificare
$destination_file = "/aggiornamento/studenti.xml";

HTH

John

I file studenti.xml e aggiornamentodatabase.php sono nella stessa cartella infatti ho provato come dici tu ma mi ha detto che non trovava il file:

Quote:

Warning: ftp_get(/aggiornamento/studenti.xml): failed to open stream: No such file or directory in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Warning: ftp_get(): Error opening /aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Errore durante il recupero del file dal server ftp

allora ho provato mettendo solamente
$destination_file = "/studenti.xml";
e mi dice che non ho i permessi:
Quote:

Warning: ftp_get(/studenti.xml): failed to open stream: Permission denied in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Warning: ftp_get(): Error opening /immobili.xml in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Errore durante il recupero del file dal server ftp

ho provato a settare a 777 i permessi del file aggiornamentodatabase.php mantenendo a 755 quelli di studenti.xml ma mi ha dato errore interno del server:

Quote:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, [email protected] and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.

QUALCUNO SA COSA STO SBAGLIANDO!?
colgo anche l'occasione per fare un'altra domanda:
dove vedo i log di errore su un server linux di aruba?

grazie mille a tutti!
:D

Ho fatto un'ulteriore prova e, secondo me, mi sto avvicinando alla soluzione...
ho provato a mettere:

$destination_file = "ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml";
$source_file = "ftp://utentegestionale:[email protected]/studenti.xml";

Quote:

Warning: ftp_get(ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml[/codefilter_code]): failed to open stream: Remote file already exists and overwrite context option not specified FTP server reports 213 272337 in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Warning: ftp_get(): Error opening ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml[/codefilter_code] in /web/htdocs/www.miosito.it/home/aggiornamento/aggiornamentodatabase.php on line 29 Errore durante il recupero del file dal server ftp

quindi, sempre secondo me, devo capire il modo di dirgli che il file va sovrascritto e il gioco è fatto!
ditemi che è cosi!!!
e magari ditemi anche come fare...
:P

Sposto.

La tua domanda mi pare sia quella di RECUPERARE un file da FTP e salvarla in locale, andando poi a modificare il file locale e caricandolo nel DB, corretto? Se si, il codice iniziale mi pare che prenda il file locale e cerchi di sovrascrivere quello remoto, mi sbaglio? Tra l'altro stai passando come path del file uno stream wrapper (HTTP) che non permette la scrittura (a meno che non hai installato e configurato WebDav con autenticazione), quindi presumo che il problema sia nei path che stai usando, corretti i path dovrebbe essere tutto ok ;)

Per quanto riguarda i path dell'FTP ti consiglio di loggarti con un client "manipolabile" (es: Filezilla) e vedere quale è il path del tuo file remoto, potrebbe essere che devi indicare il path assoluto o meno, in base alla configurazione del server FTP.

Ciao
Marco
--
My blog
Working at @agavee

praticamente io prendo il file studenti.xml dal server del gestionale e lo devo spostare sul mio server (dove c'è già un file studenti.xml che deve essere sovrascritto) le altre operazioni che devo fare sono già apposto.
Ora provo a vedere i path...
grazie della risposta!
:D

Ho provato cambiando i path ed il codice è questo:

//RECUPERO IL FOGLIO XML DAL SERVER FTP

Quote:
[code]
//Connessione al server ftp
$ftp_host = 'www.nomesorgente.it';
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
$source_file = "ftp://nomeutente:[email protected]/studenti.xml";
//Login al server ftp
$username = 'nomeutente';
$pwd = 'pass';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$destination_file = "ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml";
ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");
//Chiusura della connessione al server ftp
ftp_quit($connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
[/CODE]

ma ho sempre il solito errore:

Quote:
[CODE]
Warning: ftp_get(ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml): failed to open stream: Remote file already exists and overwrite context option not specified FTP server reports 213 0 in /web/htdocs/www.miosito.it/home/aggiornamento/provasovrascrivere.php on line 33 Warning: ftp_get(): Error opening ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/provasovrascrivere.php on line 33 Errore durante il recupero del file dal server ftp
[/CODE]

avete in mente qualcos'altro che protrei sbagliare?

Il problema è che la funzione ftp_get() non può fare quello che stai tentando tu. Oppura stai sbagliando l'utilizzo della funzione.

Sia le parametri della funzione, sia l'esempio su php.net indicano che la funzione accetta una sola conessione, specificando due percorsi.

Ma tu stai cercando di usare due connessioni.

Allora, (secondo me, ma posso sbagliare) o devi cercare una funzione diverse, o devi fare due passaggi; dal remoto A in locale, e poi da locale in remoto B. Altrimenti fai girare il codice sul server che deve ricevere il file, quindi diventa locale e deve solo prendere il file da remoto A.

HTH
John

Più imparo, più dubito.

esatto...
penso che la soluzione giusta sia la seconda.
Ho caricato il mio script sul server che deve ricevere il file, faccio la connessione sul server origine e carico il file.
Il codice che ho usato è questo:

/* Connessione al server ftp per il recupero del file studenti.xml*/
$ftp_host = 'www.nomeorigine.it';
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
/* login al server ftp */
$username = 'utente';
$pwd = 'password';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$destination_file = "ftp://[email protected]:passaruba@ftp.miosito.it/www.miosito.it/aggiornamento/studenti.xml";
$source_file = "ftp://utente:[email protected]/studenti.xml";
if
(file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo $source_file.' does not exist<br/>';}
ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");

come potete vedere dal codice ho fatto un controllo sull'esistenza del file origine (che comunque sono sicuro che esiste), inoltre prima di questo pezzo di codice ho fatto in modo che il file studente.xml sul mio server venisse cancellato per evitare problemi di permessi.
Comunque lo script mi da questo errore:
inizio
ciao
ftp://utente:[email protected]/studenti.xml esiste
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 47 Errore durante il recupero del file dal server ftp

la riga 47 è quella che ha il ftp_get()...

Come ho detto nel primo post di questo thread, la tua $destination_file deve riferire al file system del server, non una connessione FTP - che fra l'altro non l'hai neanche creato.

Prima abbiamo provato con /aggiornamento/studenti.xml ed anche /studenti.xml, ma dava errore, quindi prova:
./studenti.xml
e se quello fallisce, con
studenti.xml
(come l'esempio in php.net)

Ovviamente bisogna controllare che /web/htdocs/www.miosito.it/home/aggiornamento[/codefilter_code] ha i permessi giusti per scrivere dei file, per l'utenza che fa girare Drupal.

Fateci sapere...

Più imparo, più dubito.

Ho ricominciato e fatto diverse prove perchè stavo cominciando a perdere il lume della ragione.
Il codice è questo:

<?php
/* Recupero del file studenti.xml nuovo e inserimento nel server*/
/* login al server ftp */
$username = 'utente_remoto';    //l'utente sul server remoto sul quale vado a prendere il file nuovo
$pwd = 'password_remoto';    //la password sul server remoto sul quale vado a prendere il file nuovo
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
$destination_file = <---qua vado a inseire i valori sui quali ho fatto le varie prove
$source_file
= "<a href="ftp://utente_remoto:[email protected]_remoto.it/studenti.xml";
if" rel="nofollow">ftp://utente_remoto:[email protected]_remoto.it/studenti.xml";
if</
a> (file_exists($source_file)) {print $source_file." esiste<br/>";}
else {echo
$source_file.' does not exist<br/>';}
if (
file_exists($destination_file)) {print $destination_file." esiste<br/>";}
else {echo
$destination_file.' does not exist<br/>';}
ftp_get($connect, $destination_file, $source_file, FTP_ASCII) or die("Errore durante il recupero del file dal server ftp");
/* chiusura connessione al server ftp */
ftp_quit($connect) or die("Si è verificato un errore durante la chiusura della connessione al server ftp");
?>

e queste sono i risultati che ho ottenuto in base a ciò che ho messo in $destination_file:

1)La prova con http://www.miosito.it/aggiornamento/studenti.xml mi ha dato questo risultato

ftp://utente_remoto:[email protected]_remoto.it/studenti.xml esiste
http://www.miosito.it/aggiornamento/studenti.xml does not exist
Warning: ftp_get(http://www.miosito.it/aggiornamento/studenti.xml): failed to open stream: HTTP wrapper does not support writeable connections in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 18 Warning: ftp_get(): Error opening http://www.miosito.it/aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 18 Errore durante il recupero del file dal server ftp

2)La prova con /aggiornamento/studenti.xml mi ha dato questo risultato

ftp://utente_remoto:[email protected]_remoto.it/studenti.xml esiste
/aggiornamento/studenti.xml does not exist
Warning: ftp_get(/aggiornamento/studenti.xml): failed to open stream: No such file or directory in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Warning: ftp_get(): Error opening /aggiornamento/studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp

3)La prova con /studenti.xml mi ha dato questo risultato

ftp://utente_remoto:[email protected]_remoto.it/studenti.xml esiste
/studenti.xml does not exist
Warning: ftp_get(/studenti.xml): failed to open stream: Permission denied in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Warning: ftp_get(): Error opening /studenti.xml in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp

4)La prova con./studenti.xml mi ha dato questo risultato

ftp://utente_remoto:[email protected]_remoto.it/studenti.xml esiste
./studenti.xml esiste
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp

5)La prova con studenti.xml mi ha dato questo risultato

ftp://utente_remoto:[email protected]_remoto.it/studenti.xml esiste
studenti.xml does not exist
Warning: ftp_get(): Failed to open file. in /web/htdocs/www.miosito.it/home/aggiornamento/prova sovrascrivere.php on line 19 Errore durante il recupero del file dal server ftp

Poichè solo la prova numero 4 (./studenti.xml) sembra dire che il file esiste penso che sia quella alla quale dedicare maggiore attenzione.
secondo voi che cosa non torna?

ps:

Quote:
Ovviamente bisogna controllare che /web/htdocs/www.miosito.it/home/aggiornamento ha i permessi giusti per scrivere dei file, per l'utenza che fa girare Drupal.

Come faccio questa verifica?
Potrebbe essere proprio questo il problema!
:D

grazie dell'aiuto!!!
e scusate se ho scritto un poema...
:P

Meglio la poesia, più informazione che dai, più facile trovare la soluzione...

Mi sa che ti stai creando confusione. Il codice che hai pubblicato nel post originale era più corretto.

Il confusione sta nella connessione FTP. Devi fare tre cose:
1. Creare la connessione (qui quel codice manca)
2. Con la connessione, fare il login (e questo va bene)
3. Estrare il file, che prima si chiamava file.xml

Una volta connesso e loggato (come per un qualunque cliente FTP), il server FTP va ad un indirizzo - questo è di solito lo home. Per accedere ad un file, è sufficiente specificare il percorso dal home - ma tu ti sei messo ad aggiungere utente/[email protected] - creando un altro connessione. Non credo che questo sia necessario - lo so, lo so, funziona, ma probabilmente funziona usando un percorso più semplice.

Per quanto riguarda le tue prove:
1. Insisti? Perchè chiamare te stesso tramite http? Il codice sta già girando su quel server...
2. Dice "No such file or directory" - probabilmente non c'è l'indirizzo, il file non dovrebbe esistere la prima volta.
3. Non hai i permessi corretti per aprire (cioè creare) il file.
4. Perchè il file esiste? Forse non hai cancellato i file dopo ogni test?
5. Quale file? Secondo me quello sul server FTP. Possibilmente un firewall, allora proviamo il modo passivo.

<?php
// Prima: Connessione al server ftp
$ftp_host = '<a href="http://www.hostgesionale.it';
if
" rel="nofollow">www.hostgesionale.it';
if</a> ((
$connect = ftp_connect($ftp_host) == FALSE) {
  die("
Si è verificato un errore durante la connessione al server ftp");
}
// Secondo: Login al server ftp
$username = 'miousersulgestionale';
$pwd = 'miapasssulgestionale';
if (ftp_login(
$connect, $username, $pwd) == FALSE) {
  ftp_quit(
$connect);
  die("
Si è verificato un errore durante l'accesso al server ftp");
}
// Terzo: (opzionale solo se continua ad fallire) entriamo in modo passivo
if (ftp_pasv($connect, TRUE) == FALSE) {
  ftp_quit($connect);
  die("Si è verificato un errore entrando in modo passivo sul server ftp");
}
// Debugging
print "FTP: pwd ". ftp_pwd($connect);
print "FTP: Raw list ". print_r(ftp_rawlist($connect, '
.'), TRUE);
print "Local: pwd ". getcwd();
print "Local: permissions ". substr(sprintf('
%o', getcwd()), -4);
// Quarto: recupero del file
$source_file = "file.xml";
$destination_file = "studenti.xml";
if (ftp_get($connect, $destination_file, $source_file, FTP_ASCII) == FALSE) {
  ftp_quit($connect);
  die("Errore durante il recupero del file dal server ftp");
}
// Quinto: Chiusura della connessione al server ftp
if (ftp_quit($connect) == FALSE) {
  die("Si è verificato un errore durante la chiusura della connessione al server ftp");
}
?>

Fateci sapere...

Più imparo, più dubito.

Hai proprio ragione, sto facendo confusione...
Comunque stamattina ho avuto un'illuminazione: ho pensato che a me non serve che scriva il file xml sul mio server ma basta che lo legga dal server del gestionale risparmiando il tempo necessario alla scrittura...
Ho preparato questo codice che verifica anche se il file sul gestionale esite o no...

<?php
/* Connessione al server ftp*/
$ftp_host = '<a href="http://www.server_gesionale.it';
" rel="nofollow">www.server_gesionale.it';
</a>
$connect = ftp_connect($ftp_host) or die("Si è verificato un errore durante la connessione al server ftp");
/* login al server ftp */
$username = 'user_gestionale';
$pwd = 'pass_gestionale';
$login = ftp_login($connect, $username, $pwd) or die("Si è verificao un errore durante l'accesso al server ftp");
    $source_file = "<a href="http://www.server_gestionale.it/studenti.xml";
" rel="nofollow">http://www.server_gestionale.it/studenti.xml";
</a>    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "<a href="ftp://www.server_gestionale.it/studenti.xml";
" rel="nofollow">ftp://www.server_gestionale.it/studenti.xml";
</a>    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "./studenti.xml";
    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "/studenti.xml";
    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "studenti.xml";
    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "<a href="ftp://[email protected]_gestionale.it/studenti.xml";
" rel="nofollow">ftp://[email protected]_gestionale.it/studenti.xml";
</a>    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "<a href="ftp://user_gestionale:[email protected]_gestionale.it/studenti.xml";
" rel="nofollow">ftp://user_gestionale:[email protected]_gestionale.it/studenti....</a>    if (file_exists($source_file)) {print $source_file." esiste<br/>";}
        else {echo $source_file.'
does not exist<br/>';}
    $source_file = "<a href="ftp://user_gestionale:[email protected]_gestionale.it/studenti.xml";
" rel="nofollow">ftp://user_gestionale:[email protected]_gestionale.it/studenti....</a>    $xml = simplexml_load_file ($source_file);
    echo "<h3>Studenti salvati nel file studenti.xml (".count($xml->studente).")</h3>";
    foreach($xml->studente as $studente)
    {
        $id=$studente->ID;
        print "id=".$id."<br/>";
}
?>

Però come si vede da questo risultato solo il percorso ftp contenente utente e pass risulta valido...

http://www.server_gestionale.it/studenti.xml does not exist
ftp://www.server_gestionale.it/studenti.xml does not exist
./studenti.xml does not exist
/studenti.xml does not exist
studenti.xml does not exist
ftp://[email protected]_gestionale.it/studenti.xml does not exist
ftp://user_gestionale:[email protected]_gestionale.it/studenti.xml esiste
Warning: simplexml_load_file(): connect() failed: Connection timed out in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(ftp://[email protected]_gestionale.it/studenti.xml): failed to open stream: FTP server reports RETR in /web/htdocs/www.tuscanyre.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(): I/O warning : failed to load external entity "ftp://ex_1094_periodici:[email protected]/immobili.xml" in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 34 Warning: simplexml_load_file(): I/O warning : failed to load external entity "ftp://[email protected]:pass_aruba@ftp.miosito.it/www.miosito.it/aggiornamento/immobili.xml" in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 35
Immobili salvati nel file studenti.xml (0)
Warning: Invalid argument supplied for foreach() in /web/htdocs/www.miosito.it/home/aggiornamento/provanuova.php on line 37

Secondo voi cosa sto sbagliando?

ps: ora provo anche il codice che mi avevi suggerito te... non si sa mai! grazie mille!!!
:D