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:
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.
sb ist hier ein StringBuffer, der in der Debug-Umgebung ausgegeben wird. Der Output zeigt ganz klar:
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?
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?