View Full Version : Problemi con FTPClient di apache commons
Ciao, sto scrivendo un programma Java che deve uploadare dei file via FTP.
Sto usando l'FTPClient di apache commons (org.apache.commons.net.ftp.FTPClient) e ho un problemino:
quando viene uploadato un file non so se è un file di testo o immagine o cosa, quindi non so se impostare come file type BINARE_FILE_TYPE o ASCII_FILE_TYPE o cos'altro. Come potrei fare?
Grazie!
banryu79
07-04-2010, 16:04
Di default (in quella libreria) è ASCII_FILE_TYPE.
Io a suo tempo ho utilizzato la libreria ftp4j e lì l'equivalente della classe FTPClient oltre ad avere la modalità testuale e quella binaria, metteva a disposizione una modalità "automatica" (di default, tra l'altro).
In quella modalità si arrangiava il client a stabilire, di volta in volta, che modalità di trasferimento dati avrebbe usato. In pratica il client si appoggiava a una classe che implementava una sorta di riconoscitore di estensioni con i quale valuare se un dato tipo di file, stabilito dalla sua estensione, andasse trasferito in modalità testuale o binaria.
In ftp4j la classe che implementa il riconosictore di estensioni testuali di default (perchè poi sei sempre libero di difinirtene uno custom) considerava come file testuali (e quindi impostava la modalità di trasferimento con il server di conseguenza) tutti i file con le seguenti estensioni:
abc acgi aip asm asp c c cc cc com conf cpp
csh css cxx def el etx f f f77 f90 f90 flx
for for g h h hh hh hlb htc htm html htmls
htt htx idc jav jav java java js ksh list
log lsp lst lsx m m mar mcf p pas php pl pl
pm py rexx rt rt rtf rtx s scm scm sdml sgm
sgm sgml sgml sh shtml shtml spc ssi talk
tcl tcsh text tsv txt uil uni unis uri uris
uu uue vcs wml wmls wsc xml zsh
Cosa che per le mie esigenze andava benissimo.
Non so come normalmente ci si regoli, ma magari puoi fare una cosa analoga.
Si, ci si metterebbe anche pochissimo a fare un riconoscitore del genere, però chi mi garantisce di beccarmi tutti i casi (per esempio i file di properties non sono presenti nell'elenco) ? Se io imposto la modalità di trasferimento SEMPRE binary, i file testuali si modificano?
banryu79
07-04-2010, 17:42
Se io imposto la modalità di trasferimento SEMPRE binary, i file testuali si modificano?
Estratto dal manule di ftp4j:
Quando un trasferimento è binario il file viene trattato da ambo le parti come una sequenza binaria, cioè un flusso di byte, e viene registrato da chi lo riceve così come gli è arrivato, senza analisi o manipolazioni dei dati ricevuti. Quando un trasferimento è testuale, al contrario, ambo le parti possono applicare delle trasformazioni di charset. Si immagini di avere un client in esecuzione su una piattaforma Windows, mentre il server gira su un sistema UNIX. Normalmente i charset usati dalle due piattaforme sono diversi. Il client deve inviare al sito remoto un file dai contenuti testuali. Scegliendo il trasferimento testuale il client leggerà il file supponendo che i suoi contenuti siano stati codificati secondo il charset predefinito della macchina che lo esegue. Il contenuto del file sarà decodificato e ricodificato in una codifica intermedia. Il server riceverà i dati nella codifica intermedia, e sarà suo compito riconvertirli secondo il charset predefinito della propria macchina. Se i charset di partenza e di destinazione sono differenti la sequenza di byte che compone il file trasferito sarà molto probabilmente cambiata, ma il contenuto rimarrà lo stesso e la leggibilità mantenuta.
Altre letture qui (http://www.rhinosoft.com/newsletter/NewsL2008-03-18.asp) e qui (http://webcache.googleusercontent.com/search?q=cache:hp6gjKwQ3mAJ:www.gelosoft.com/FTP_File_Transfer_Modes.doc+FTP+transfer+mode&cd=4&hl=it&ct=clnk&gl=it) che in pratica non fanno altro che ribadire il concetto.
Si, ci si metterebbe anche pochissimo a fare un riconoscitore del genere, però chi mi garantisce di beccarmi tutti i casi (per esempio i file di properties non sono presenti nell'elenco)?
Aggiungi tutte le estensioni che vuoi all'elenco.
Immagino che in software "di spessore" il riconoscimento del tipo di file si faccia non solo esaminando la sua estensione, ma forse con qualche euristica esaminandone il contenuto.
Sicuramente un riconoscitore serio analizza il contenuto. In prima implementazione mi accontenterò di vedere l'estensione.
Sembra però che FTPClient di apache commons non trasferisca in in binary i file anche se gli imposto ftpClient.setFileType(FTP.BINARY_FILE_TYPE);, infatti quando trasferisco un'immagine quella risultante ha dimensioni diverse :muro: . Mhmm qualche idea?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.