Warum erscheinen meine Bilder fehlerhaft?
Wenn Sie ein Java-Entwickler sind, der mit Servlets und Datei-Uploads arbeitet, haben Sie möglicherweise ein frustrierendes Problem festgestellt: hochgeladene Bilder, die fehlerhaft oder beschädigt erscheinen, wenn sie geöffnet werden. Dies kann besonders verwirrend sein, wenn Textdateien ohne Probleme hochgeladen werden. In diesem Blogbeitrag werden wir untersuchen, warum das passiert, und klare Lösungen zur Behebung des Problems bereitstellen.
Das Problem verstehen
Beim Arbeiten mit Datei-Uploads, insbesondere mit Bilddateien, ist es entscheidend, binäre Daten korrekt zu verarbeiten. Die fehlerhafte Ausgabe weist normalerweise darauf hin, dass der binäre Stream entweder nicht richtig gelesen oder nicht korrekt in die Datei geschrieben wurde. Der folgende Codeabschnitt zeigt eine typische Methode zum Hochladen von Dateien mit Apache Commons FileUpload:
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
...
BufferedInputStream stream = new BufferedInputStream(item.openStream());
...
}
In dieser Methode werden Bilder und andere binäre Dateien verarbeitet, aber die Art, wie die Daten gelesen werden, kann zu Problemen führen, die die Bilddateien beschädigen.
Den Code analysieren
Ein entscheidender Teil des Codes, der zum Problem beiträgt, befindet sich in der Methode zum Lesen von Bytes aus dem Eingabestream. Hier ist der relevante Codeabschnitt:
public static byte[] getBytes(InputStream src, int buffsize) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] buff = new byte[buffsize];
while (true) {
int nBytesRead = src.read(buff);
if (nBytesRead < 0) {
break;
}
byteStream.write(buff);
}
...
}
Das Problem identifizieren
- Komplette Puffer-Schreibung: Die Zeile
byteStream.write(buff);
schreibt den gesamten Puffer, unabhängig davon, wie viele Bytes tatsächlich gelesen wurden. Dies ist problematisch, da in vielen FällennBytesRead
kleiner als die Puffergröße sein wird, was bedeutet, dass verbleibende Bytes von vorherigen Lesevorgängen in die Ausgabe geschrieben werden könnten, was zu Beschädigungen führt.
Vorgeschlagene Lösung
Um dieses Problem zu beheben, müssen wir anpassen, wie Bytes in den ByteArrayOutputStream
geschrieben werden. Der überarbeitete Code sollte etwa so aussehen:
public static byte[] getBytes(InputStream src, int buffsize) throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
byte[] buff = new byte[buffsize];
while (true) {
int nBytesRead = src.read(buff);
if (nBytesRead < 0) {
break;
} else {
byteStream.write(buff, 0, nBytesRead); // Nur die gelesenen Bytes schreiben
}
}
...
}
Wichtige Änderungen
- Bedingte Schreibweise: Der
else
-Zweig stellt sicher, dass wir nur die Bytes schreiben, die tatsächlich gelesen wurden. - Spezifizierte Länge: Beim Schreiben geben wir jetzt die Anzahl der zu schreibenden Bytes an, indem wir
byteStream.write(buff, 0, nBytesRead);
verwenden.
Diese Änderungen verhindern, dass alte, nicht benötigte Daten geschrieben werden, und stellen sicher, dass die Bilddateien ohne Beschädigung erhalten bleiben.
Fazit
Wenn Sie Probleme mit dem Hochladen von Bildern in Ihrer Java-Anwendung haben, liegt die Ursache häufig in der Art und Weise, wie Sie den Eingabestream verarbeiten. Indem Sie Ihre Logik zum Lesen und Schreiben von Byte-Streams verfeinern, können Sie Probleme beseitigen, die zu fehlerhaften Bildern führen.
Indem Sie die oben genannten Richtlinien befolgen und korrigieren, wie Sie Byte-Streams lesen und schreiben, können Sie zukünftige Probleme mit Datei-Uploads in Ihren Java-Anwendungen vermeiden. Viel Spaß beim Programmieren!