Discussione:
problemi download con Java FTPClient
(troppo vecchio per rispondere)
FabioCer
2022-11-21 12:15:53 UTC
Permalink
Buon pomeriggio,

devo scaricare dei pdf dai server ftp di alcuni corrieri,
ho creato questa classe per fare qualche test e funziona egregiamente
sia l'approccio 1 che il 2, i file li trovo belli belli nella directory
del mio PC.

Bene, ora vado ad inserire lo stesso pezzo di codice in una JSP che
gira sotto Tomcat 9.x.x in un AS400 o meglio IBM i 7.2 e scarico i
documenti in una mia directory nell'IFS... i documenti li scarica,
ma non belli belli, ci sono dei pezzi colorati/ombreggiati con varie
sfumature tipo le foto sviluppate da pelliccola che ha preso luce,
spero di essermi spiegato.

ma!!! per non per tutti i corrieri, al momento sono 4, uno funziona
bene, come la classe eseguita da PC, qli altri 3 hanno il problema
che ho descritto, la sola differenza è che quello che funziona mette i
documenti nella root mentre gli altri li mettono in percorsi senza spazi
tipo /pod/, /POD/out/, /OUT_POD/

qualche idea?

aggiungo che queste due righe sono assolutamente ininfluenti
client.setFileTransferMode(FTP.BINARY_FILE_TYPE);
client.setFileType(FTP.BINARY_FILE_TYPE,

e che ho provato a specificare il percorso sia dritto
che rovescio "/pod/" "\\pod\\"


questo è il codice


import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import java.io.IOException;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class FTPListAndDownloadDemo {
public static void main(String[] args) {

String server = "xxxxxxxxxx";
int port = 21;
String user = "xxxxxxxxxx";
String password = "xxxxxxxxxx";
// String rpath = "/pod/";
String rpath = "\\pod\\";

FTPClient client = new FTPClient();
String[] names = null;

try {
client.connect(server, port);
client.login(user, password);

if (client.isConnected()) {
client.enterLocalPassiveMode();

// client.setFileTransferMode(FTP.BINARY_FILE_TYPE);
// client.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);

FTPFile[] files = client.listFiles(rpath);
for (FTPFile file : files)
{
System.out.println("Name = " + rpath + file.getName());

// APPROACH #1: using retrieveFile(String, OutputStream)
String remoteFile1 = rpath + file.getName();
File downloadFile1 = new File("scaricati/approach1/" + file.getName());
OutputStream outputStream1 = new BufferedOutputStream(new
FileOutputStream(downloadFile1));
boolean success = client.retrieveFile(remoteFile1, outputStream1);
outputStream1.close();

if (success) {
System.out.println("File #1 has been downloaded successfully.");
}

// APPROACH #2: using InputStream retrieveFileStream(String)
String remoteFile2 = rpath + file.getName();
File downloadFile2 = new File("scaricati/approach2/" + file.getName());
OutputStream outputStream2 = new BufferedOutputStream(new
FileOutputStream(downloadFile2));
InputStream inputStream = client.retrieveFileStream(remoteFile2);
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
while ((bytesRead = inputStream.read(bytesArray)) != -1) {
outputStream2.write(bytesArray, 0, bytesRead);
}

success = client.completePendingCommand();
if (success) {
System.out.println("File #2 has been downloaded successfully.");
}
outputStream2.close();
inputStream.close();
}
}
client.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Suarez
2022-11-22 11:06:12 UTC
Permalink
Post by FabioCer
Buon pomeriggio,
devo scaricare dei pdf dai server ftp di alcuni corrieri,
ho creato questa classe per fare qualche test e funziona egregiamente
sia l'approccio 1 che il 2, i file li trovo belli belli nella directory
del mio PC.
Bene, ora vado ad inserire lo stesso pezzo di codice in una JSP che
gira sotto Tomcat 9.x.x in un AS400 o meglio IBM i 7.2 e scarico i
documenti in una mia directory nell'IFS... i documenti li scarica,
ma non belli belli, ci sono dei pezzi colorati/ombreggiati con varie
sfumature tipo le foto sviluppate da pelliccola che ha preso luce,
spero di essermi spiegato.
ma!!! per non per tutti i corrieri, al momento sono 4, uno funziona
bene, come la classe eseguita da PC, qli altri 3 hanno il problema
che ho descritto, la sola differenza è che quello che funziona mette i documenti
nella root mentre gli altri li mettono in percorsi senza spazi
tipo /pod/, /POD/out/, /OUT_POD/
qualche idea?
Do per scontato che apri i pdf direttamente dal tuo pc sfogliando l'ifs del
Power server, ad ogni modo il primo controllo che farei riguarda le
autorizzazioni dei file e il loro CHAR ID/CCSID.
--
Questa email è stata esaminata alla ricerca di virus dal software antivirus Avast.
www.avast.com
FabioCer
2022-11-22 13:05:49 UTC
Permalink
Post by Suarez
Do per scontato che apri i pdf direttamente dal tuo pc sfogliando l'ifs
del Power server, ad ogni modo il primo controllo che farei riguarda le
autorizzazioni dei file e il loro CHAR ID/CCSID.
no, no le autorizzazioni sono a posto,
e i files arrivavano nell'IFS già svaccati...
ho scritto sotto come ho risolto.
FabioCer
2022-11-22 13:04:09 UTC
Permalink
dopo varie prove ho scoperto che il metodo 'setFileType'
della classe 'FTPClient' ha due costruttori:

boolean setFileType(int fileType) Sets the file type to be transferred.

boolean setFileType(int fileType, int formatOrByteSize) Sets the file
type to be transferred and the format.

io avevo provato in due modi, prima senza specificare setFileType
e poi specificando
setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
in entrambi i casi i problemi che ho descritto

mentre specificando:
setFileTransferMode(FTP.BINARY_FILE_TYPE);

sebra funzionare...
sto cercando di capire a cosa serve il secondo parametro (formatOrByteSize),
ma al momento non ho trovato nulla.

se qualcuno sa, parli!
Suarez
2022-11-23 08:37:16 UTC
Permalink
Post by FabioCer
dopo varie prove ho scoperto che il metodo 'setFileType'
boolean   setFileType(int fileType) Sets the file type to be transferred.
boolean   setFileType(int fileType, int formatOrByteSize) Sets the file type to
be transferred and the format.
io avevo provato in due modi, prima senza specificare setFileType
e poi specificando
setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
in entrambi i casi i problemi che ho descritto
setFileTransferMode(FTP.BINARY_FILE_TYPE);
sebra funzionare...
sto cercando di capire a cosa serve il secondo parametro (formatOrByteSize),
ma al momento non ho trovato nulla.
se qualcuno sa, parli!
Questo immagino tu lo abbia visto
https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setFileType-int-int-

https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setFileTransferMode-int-
--
Questa email è stata esaminata alla ricerca di virus dal software antivirus Avast.
www.avast.com
Loading...