Загрузка Java jpg с использованием JakartaFtpWrapper - делает файл нечитаемым
Я использовал JakartaFtpWrapper для загрузки файлов из клиентского Java-приложения на мой сервер (для целей резервного копирования).
Загруженные файлы - это текстовые файлы, файлы png и jpgs.
Я заметил, что jpg-файлы, действительные на локальном компьютере, как-то становятся нечитаемыми (поврежденные файлы) на сервере (где они были FTPd). Размер файла изображения похож на оригинальный, но каким-то образом он поврежден.
Вот код, который я использую для записи jpg на ЛОКАЛЬНЫЙ диск:
public static void writeJpeg(BufferedImage bfImg, String fileName, float quality) throws IOException{
FileImageOutputStream output = null;
try{
Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter)iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(quality); // an integer between 0 and 1
File file = new File(fileName);
output = new FileImageOutputStream(file);
writer.setOutput(output);
IIOImage image = new IIOImage(bfImg, null, null);
writer.write(null, image, iwp);
}
finally{
if (output != null){
output.close();
}
}
Код ftp прост:
JakartaFtpWrapper ftpClient = new JakartaFtpWrapper();
ftpClient.connectAndLogin(FTP_URL, FTP_USER, FTP_PASSWORD);
ftpClient.setPassiveMode(true);
File[] imageFiles = folder.listFiles()
for (int j=0; j<imageFiles.length; j++){
File imageFile = imageFiles[j];
if (imageFile != null && imageFile.isFile() && (FileUtils.getFileSuffix(imageFile).equals("jpg") || FileUtils.getFileSuffix(imageFile).equals("png"))){ // upload only image files
ftpClient.uploadFile(imageFile.getAbsolutePath(), imageFile.getName());
}
}
Спасибо, Ран
1 ответ
Что работает на сервере? Это FTP-сервер "из коробки" или что-то, что вы написали?
Изображения являются двоичными данными. Если JakartaFtpWrapper предлагает какую-то опцию перевода FTP в двоичный режим, вы должны это сделать; Я думаю, что наиболее вероятной причиной вашей проблемы является неудачная попытка выполнить перевод по умолчанию в текстовом режиме. Если вы сравните маленькие изображения побайтно, вы должны увидеть возврат каретки ((символ) 0x0d
== (char) 13) добавляется или удаляется рядом с 0x0a
"S. Если так, то это твоя проблема.