Mit JCIFS erstelltes jpg-File auf SMB-Share defekt

DerSvenIsts

Grünschnabel
Hallo zusammen,

ich habe ein Problem, bei dem ich nicht wirklich weiter komme und setze auf Eure Hilfe ;-)

Ich möchte ein Bild (BufferedImage), das per Java von einer IP-Webcam aufgenommen wurde auf einer SMB-Freigabe mit JCIFS-Methoden speichern, indem dort ein entsprechendes *.jpg-File erzeugt wird. Das Problem: Die erzeugte Datei auf der Freigabe scheint "defekt" zu sein, da sie sich mit einem Bildbetrachter nicht öffnen lässt. Wenn ich das *.jpg File stattdessen auf der lokalen Festplatte, also ohne JCIFS-Methoden, erstellen lasse, kann das Bild problemlos im Bildbetrachter geöffnet werden.

Hier ein Auszug aus dem Code der durchlaufen wird (ohne Exception-Handling):

Java:
import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileOutputStream;

public class SmbSaveService {

private void saveImageToSmbShare(BufferedImage imageToSave) {

String pathAndFile = "smb://192.168.0.1/bilder/test.jpg";

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,null, null);

SmbFile sFile = new SmbFile(pathAndFile, auth);
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(anImageToSave, "jpg", os);

InputStream is = new ByteArrayInputStream(os.toByteArray());
BufferedReader brl = new BufferedReader(new InputStreamReader(is));

String b = null;
while ((b = brl.readLine()) != null) {
sfos.write(b.getBytes());
}

sfos.flush();

} // end of method
} // end of class

Resultat ist bei Aufruf der Methode, dass eine ca. 13kb große Datei "test.jpg" im SMB-Share erstellt wird, die nicht geöffnet werden kann.

Wenn das BufferedImage mit folgendem Code auf der lokalen Platte erstellt wird (ca. 12kb), kann das Bild anschließend problemlos geöffnet werden:

Java:
ImageIO.write(imageToSave, "jpg", new File("c:/temp/test.jpg"));

Ich könnte jetzt natürlich das File auf der lokalen Platte erstellen und dann auf dem SMB-Share umkopieren, aber das ist ja nicht wirklich im Sinne des Erfinders.

Hoffe auf Euer Feedback. Danke im Voraus!
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

kannst du bitte so ein defektes File hier hochladen oder mir per privater Nachricht zukommen lassen? Zur weiteren Fehlersuche wäre es sehr hilfreich zu wissen, was da defekt ist.

Grüße,
BK
 

DerSvenIsts

Grünschnabel
Hallo,

Hi,

kannst du bitte so ein defektes File hier hochladen oder mir per privater Nachricht zukommen lassen? Zur weiteren Fehlersuche wäre es sehr hilfreich zu wissen, was da defekt ist.

Grüße,
BK

eigentlich gar kein Problem, jedoch verbietet die Validierung der Uploadfunktion im Forum das Hochladen, da die Datei nicht als Bild erkannt wird. Also ein Indiz, dass die Datei tatsächlich kaputt ist. Aus diesem Grund habe ich die Datei jetzt hier hochgeladen:

http://www.file-upload.net/download-8998214/test.jpg.html

Für mich sieht der Inhalt der Datei nur nach Datensalat aus. Mich würde interessieren, was man daran jetzt analysieren kann, damit ich mir ggf. beim nächsten Problem selber helfen kann?

Danke!
 

youza

Erfahrenes Mitglied
IrvanView zeigt folgenden Fehler an:

Decode error!
Quantization table 0x01 was not defined!

Es könnte hier ein Fehler mit dem verwendeten Transfer Protokoll bestehen.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

ich denke mal, dass der Fehler um die Zeile 31 bei den obigen Snippet liegt. Hier liest du die Rohdaten als String aus, was zwangsläufig Probleme mit dem Charset wegen der Konvertierung gibt. Arbeite hier am besten rein mit byte[], dann sollte das so funktionieren.

Ohne Schleife, einfach die Daten von A nach B schreiben.
Java:
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(anImageToSave, "jpg", os);

sfos.write(os.toByteArray());

Grüße,
BK
 

DerSvenIsts

Grünschnabel
Hi,

Hi,

ich denke mal, dass der Fehler um die Zeile 31 bei den obigen Snippet liegt. Hier liest du die Rohdaten als String aus, was zwangsläufig Probleme mit dem Charset wegen der Konvertierung gibt. Arbeite hier am besten rein mit byte[], dann sollte das so funktionieren.

Ohne Schleife, einfach die Daten von A nach B schreiben.
Java:
SmbFileOutputStream sfos = new SmbFileOutputStream(sFile);

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(anImageToSave, "jpg", os);

sfos.write(os.toByteArray());

Grüße,
BK

danke für die schnelle Hilfe. Da kann ich nur sagen: Weniger Code... weniger Fehler :) Lag genau daran, was du vermutet hast. Funktioniert nun einwandfrei.
 

Neue Beiträge