Java - hochgeladene Datei im RAM halten

bitmuncher

Senior-Nerd
Situation: Über ein HTML-Form werden Dateien via POST-Request an ein Servlet weitergereicht.
Problem: Sobald die Dateien beim Servlet ankommen, werden sie auf die Platte als temporäre Dateien geschrieben. Dies soll aber unterbunden werden. Die FileItems sollen im RAM bleiben und von dort an eine Verschlüsselungsroutine übergeben werden. Erst die verschlüsselten Daten dürfen auf der Platte ankommen.

In der Praxis sieht das bei mir aktuell so aus. Wie üblich nehme ich die Upload-Daten via ServletFileUpload (aus Apache-Commons) entgegen:

Code:
DiskFileItemFactory factory = new DiskFileItemFactory(Integer.MAX_VALUE, null);
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
	items = upload.parseRequest(request);
} catch(FileUploadException fue) {
	fue.getMessage();
}

Hier sollte eigentlich der null-Parameter für DiskFileItemFactory dafür sorgen, dass die Daten im RAM bleiben. Schaue ich mir allerdings ein einzelnes Item an, wird mir angezeigt, dass die Daten auf der Platte landen.

Code:
Iterator<FileItem> iter = items.iterator();
while(iter.hasNext()) {
	FileItem item = iter.next();
	if (item.isFormField()) {
		...
	} else {
		if(item.getSize() > 0) {
			...
			sb.append("Content: " + item.toString() + "<br />\n");
			...
		}
	}
}

sb ist hier ein StringBuffer, der in der Debug-Umgebung ausgegeben wird. Der Output zeigt ganz klar:

Content: name=gcrypt.pdf, StoreLocation=/operation/tomcat/temp/upload_6b735d13_148f4ce99f6__7ff4_00000002.tmp, size=556933bytes, isFormField=false, FieldName=file1

Wie kann ich dafür sorgen, dass dieses Schreiben auf die Platte nicht erfolgt und die Upload-Daten so lange im RAM bleiben bis ich sie explizit auf die Platte schreibe?
 
Vielleicht hilft es:

Zuerst mal die doofe Frage: Wird es denn auch tatsächlich abgespeichert dort?

Wird getOutputStream() auf dem FileItem aufgerufen?

Die toString() Methode von FileItem sagt, dass "StoreLocation=" von getStoreLocation() kommt.
getStoreLocation() nimmt den Pfad von dfos, wobei dfos in der getOutputStream() gesetzt wird.
Dort wird ein File Objekt erzeugt mit der getTempFile() Methode und die sieht so aus:
Code:
    protected File getTempFile() {
        if (tempFile == null) {
            File tempDir = repository;
            if (tempDir == null) {
                tempDir = new File(System.getProperty("java.io.tmpdir"));
            }
...

Der Methode ist also dein "null" ziemlich egal.

Siehe: Source code


EDIT: Dein Threshold sollte eben groß genug sein. Da ich jetzt auch nicht den kompletten Quellcode durchgucken will, halte ich es auch wahrscheinlich, dass das nur der Pfad einer Dummydatei ist, wo der Inhalt liegen würde oder eben durch irgendein Seiteneffekt doch dort reingeschrieben wird.
 
Zuletzt bearbeitet:
Zurück
Oben