FabioCer
2022-11-21 12:15:53 UTC
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();
}
}
}
}
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();
}
}
}
}