J'essaie d'utiliser Apache Commons Net pour les transferts de fichiers FTP.
Problème est des fichiers arrivant par intermittence sur le serveur corrompu. Par "corrompu", je veux dire que Winrar me dit qu'un fichier zip a une "fin inattendue des archives" em>. Parfois, les fichiers sont complètement vides. J'ai remarqué que cela se produit plus pour les fichiers plus importants (100 kb +), cependant cela se produit aussi pour les petits fichiers (20 Ko). P> Je sais pour un fait que le fichier zip source étant téléchargé est valide et est seulement 243kb. P> Je n'ai aucune erreur / exceptions à partir du code. P> Voici le code étant exécuté: p> et Quelques journaux: p> Notez que toutes ces personnes étaient terminées dans les 15 secondes, et tous les fichiers résultants du serveur sont corrompus. P> J'ai également testé sans régler aucun délai et le problème survient toujours. P> p>
3 Réponses :
Commons FTP par défaut des types de fichiers ASCII. Vous souhaitez la définir sur binaire lors de la gestion des données binaires comme un fichier zip. P>
de http: // communications. apache.org/net/api/org/apache/comment/net/ftp/ftpclient.html p>
Les paramètres par défaut pour FTPClient sont pour utiliser ftp.ascii_file_type, ftp.non_print_text_format, ftp.stream_transfer_mode et ftp.file_structure. Les seuls types de fichiers directement pris en charge sont FTP.ASCII_FILE_TYPE et FTP.BINARY_FILE_TYPE. p> blockQuote>
Vous voulez faire
setFileType (ftp.binaire_file_type) code> avant d'envoyer le fichier. p>
Assurez-vous de ftpclient.setfileType (ftp.binaire_file_type) code> Après une méthode de connexion, car Connect () réinitialisera le type à
ftp.ascii_file_type code>.
Non seulement après Connect, CODE> Il doit aller après
Connexion CODE>, voir Apache Java FTP Client Ne bascule pas en mode de transfert binaire sur certains serveurs .
J'ai eu ce problème malgré la spécification du type de fichier binaire code> donc j'ai écrit le code pour valider le fichier téléchargé via MD5 code> hachage:
MD5Checksum.java Code>: P>
import java.io.*;
import java.security.MessageDigest;
public class MD5Checksum
{
private static byte[] createChecksum(String filename) throws Exception
{
try (InputStream fileInputStream = new FileInputStream(filename))
{
byte[] buffer = new byte[1024];
MessageDigest complete = MessageDigest.getInstance("MD5");
int numRead;
do
{
numRead = fileInputStream.read(buffer);
if (numRead > 0)
{
complete.update(buffer, 0, numRead);
}
} while (numRead != -1);
return complete.digest();
}
}
public static String getMD5Checksum(String filename) throws Exception
{
byte[] checksum = createChecksum(filename);
StringBuilder result = new StringBuilder();
for (byte singleByte : checksum)
{
result.append(Integer.toString((singleByte & 0xff) + 0x100, 16).substring(1));
}
return result.toString();
}
}
J'ai eu le même problème et je l'ai résolu en appelant p> avant chaque méthode forte> fichier est corrompu, car le type de fichier par défaut est Pour éviter ce problème, vous devez appeler Donc, si vous voulez éviter les problèmes retrievefile code> ,
retrievefileStream code>,
storefile code> p>
explication h3>
ftp.ascii_file_type code >. Cela provoque le problème. Si vous êtes sur Linux, tous les octets
\ n \ r code> (la fin de fichier Windows du fichier) sont modifiés en octets
\ n code>. Et cela corrompre le fichier. P>
ftpclient.setfileType (ftp.binaire_file_type) code>. Malheureusement, cette configuration est réinitialisée par chaque
Méthode code> Retour à
ASCII_FILE_TYPE CODE>.
Dans mon cas, cela a été réinitialisé même par méthode
listfiles code>. Je suppose que cela s'est passé parce que j'utilise
passivemode code> sur ftpclient. P>
SetFileType (ftp.binaire_file_type) code > Juste avant chaque transfert de fichier fort>. p> h3>
BTW: Désolé, mais je dois le dire: ce comportement de «Apache Commons Net FTP» est vraiment terrible.
Le mode (au moins avec certains serveurs FTP) réinitialise avec Connexion code>, donc
SetFileType code> doit être appelé après le
. En général, il ne réinitialise pas avec listfiles code>, bien qu'il soit possible que votre serveur FTP particulier. La bibliothèque nette Apache Commons elle-même ne réinitialise jamais le mode seul.
Merci - Bon point - Je me souviens que cet appel setfileType code> après que la connexion n'était pas suffisante dans mon cas. Et vous avez raison, que ce problème est probablement causé par le serveur et non par la bibliothèque clientèle.