ftp_fput()
La funzione ftp_fput() è una funzione built-in di PHP che carica un file sul server FTP. Accetta cinque parametri.
Cos'è ftp_fput()?
La funzione ftp_fput() è una funzione built-in di PHP che carica un file sul server FTP. La funzione accetta cinque parametri:
ftp_stream: L'identificatore di connessione restituito dalla funzioneftp_connect().remote_file: Il nome del file remoto su cui caricare il file.local_file: Una risorsa file handle aperta confopen()che punta al file locale da caricare.mode(opzionale): La modalità di trasferimento (FTP_ASCIIoFTP_BINARY). Il valore predefinito èFTP_ASCII.startpos(opzionale): La posizione iniziale nel file remoto per il caricamento. Il valore predefinito è0.
La funzione restituisce un valore boolean. Se il caricamento del file ha successo, restituisce true. Altrimenti, restituisce false.
Quando usare ftp_fput() invece di ftp_put()
ftp_put() accetta come parametro un percorso locale del file come string e apre il file automaticamente. ftp_fput() accetta invece un handle di file già aperto. Usa ftp_fput() quando:
- I dati da caricare non si trovano in un file ordinario su disco — ad esempio uno stream temporaneo creato con
php://temp, oppure l'output di un'altra risorsa già aperta. - Hai bisogno di un controllo preciso sulla posizione di lettura (combinato con il parametro
startpos, puoi riprendere un caricamento interrotto). - Hai già aperto l'handle per un altro motivo e vuoi evitare di aprire lo stesso file due volte.
Se vuoi semplicemente caricare un file esistente per nome, ftp_put() è più semplice. Per caricamenti non bloccanti (asincroni), vedi ftp_nb_fput().
Sintassi di ftp_fput()
La sintassi della funzione ftp_fput() è la seguente:
Sintassi di ftp_fput()
bool ftp_fput ( resource $ftp_stream , string $remote_file , resource $local_file [, int $mode = FTP_ASCII [, int $startpos = 0 ]] )Utilizzo di ftp_fput()
Per usare la funzione ftp_fput(), devi prima stabilire una connessione al server FTP tramite la funzione ftp_connect(). Ecco un esempio:
Utilizzo di ftp_fput() in PHP
<?php
// Set up an FTP connection
$conn = ftp_connect('ftp.example.com');
if (!$conn) {
die("Could not connect to FTP server.");
}
// Login with your FTP credentials
if (!ftp_login($conn, 'username', 'password')) {
die("Login failed.");
}
// Open the local file
$local_file = fopen('/local/directory/local_file.txt', 'r');
if (!$local_file) {
die("Could not open local file.");
}
// Upload the file to the remote FTP server
if (ftp_fput($conn, 'remote_file.txt', $local_file, FTP_ASCII)) {
echo "File uploaded successfully.\n";
} else {
echo "Failed to upload the file.\n";
}
// Close the file handle and FTP connection
fclose($local_file);
ftp_close($conn);In questo esempio, stabiliamo una connessione al server FTP usando la funzione ftp_connect() e verifichiamo che abbia avuto successo. Poi effettuiamo il login con le nostre credenziali FTP tramite ftp_login() e controlliamo eventuali errori. Successivamente, apriamo il file locale con fopen() per ottenere il file handle necessario. Infine, carichiamo il file sul server FTP remoto usando ftp_fput() e chiudiamo sia il file handle che la connessione FTP con ftp_close().
Scegliere la modalità di trasferimento: FTP_ASCII vs FTP_BINARY
Il parametro mode controlla come vengono trasferiti i byte ed è più importante di quanto sembri:
FTP_BINARYtrasferisce il file byte per byte, senza modifiche. Usalo per immagini, archivi, eseguibili, PDF — qualsiasi cosa che non sia testo semplice. È il valore predefinito sicuro per quasi tutto.FTP_ASCIItraduce le terminazioni di riga tra la piattaforma locale e quella remota (ad es.\n↔\r\n). È appropriato solo per file di testo semplice; usarlo su dati binari corromperà il file in modo silenzioso.
Quando apri l'handle locale, abbina la modalità di fopen() al trasferimento: usa 'rb' (read binary) insieme a FTP_BINARY in modo che PHP non alteri i byte durante la lettura:
<?php
$local_file = fopen('/local/directory/photo.jpg', 'rb');
ftp_fput($conn, 'photo.jpg', $local_file, FTP_BINARY);
fclose($local_file);Gestione degli errori in ftp_fput()
È importante gestire correttamente gli errori quando si usa la funzione ftp_fput(). Se la funzione restituisce false, significa che il file non è stato caricato per qualche motivo. Ecco un esempio di come gestire gli errori:
Gestione degli errori in ftp_fput()
<?php
// Assuming $conn is already established via ftp_connect() and ftp_login()
$local_file = fopen('/local/directory/local_file.txt', 'rb');
if ($local_file === false) {
echo "Could not open the local file.\n";
} elseif (ftp_fput($conn, 'remote_file.txt', $local_file, FTP_BINARY)) {
echo "File uploaded successfully.\n";
fclose($local_file);
} else {
echo "Failed to upload the file.\n";
fclose($local_file);
}Nota l'ordine dei controlli: prima verifichiamo che fopen() abbia restituito un handle valido, poi chiamiamo ftp_fput(). Chiamare fclose() su un handle false (cosa che accade se l'esempio originale salta il controllo sull'apertura) genera un avviso, quindi chiudiamo l'handle solo nei rami in cui è stato effettivamente aperto. Questo impedisce che il messaggio di "successo" venga mai stampato quando il caricamento non è avvenuto.
Errori comuni
- Passare un percorso invece di un handle.
ftp_fput()si aspetta la risorsa restituita dafopen(), non una string con il nome del file. Se hai un percorso, usaftp_put(). - Modalità di trasferimento errata. Caricare un file binario con
FTP_ASCIIlo corrompe. In caso di dubbio, usaFTP_BINARY. - Non chiudere l'handle. Chiama sempre
fclose()una volta completato il trasferimento per liberare la risorsa. - Modalità passiva. Dietro un firewall, molti server richiedono la modalità passiva. Chiama
ftp_pasv($conn, true)dopo il login se i caricamenti si bloccano.
Conclusione
La funzione ftp_fput() carica un file su un server FTP da un file handle aperto, rendendola la scelta giusta quando i tuoi dati si trovano già in uno stream anziché a un percorso fisso su disco. Abbinala alla modalità di trasferimento corretta, controlla i valori restituiti sia da fopen() che da ftp_fput(), chiudi i tuoi handle, e funzionerà in modo affidabile nei tuoi progetti PHP.