Witam,
jestem w trakcie tworzenia aplikacji webowej z wykorzystaniem Springa i JSF. Zaimplementowałem upload pliku za pomocą biblioteki MyFaces Tomahawk i t:inputFileUpload. Wszystko działa ok. Mam natomiast problem z downloadem pliku, zwłaszcza dużego - w bazie trzymane są tylko ścieżki do plików. Napisałem servlet wg wzoru, których jest dużo na różnych stronach, główna jego część:
File file = new File(path);
FileInputStream in = new FileInputStream(file);
ServletOutputStream out = response.getOutputStream();
response.setHeader("Content-Disposition","attachment; filename=\"" + filename +"\" ");
response.setHeader("Content-Type", "application/pdf"); // download dotyczy plików pdf
response.setHeader("Content-Length", String.valueOf(file.length()));
int bytesRead = -1;
byte[] buffer = new byte[4096];
while((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
out.flush();
in.close();
out.close();
Po deployu na serwer, download działa, ale bardzo rośnie stos i po kilku downloadach wyrzuca Out Of Memory. Początkową wielkość sterty mam ustawioną na 512MB, max na 1024MB. Plik po prostu jest trzymany w pamięci. Użyłem narzędzia JProfiler, które potwierdziło, że problem jest z downloadem. Zaalokowane było 650MB dla byte[]. Jak uruchomił się GC, to wielkosc stosu trochu spadała. Ma może ktoś sposób jak rozwiązać download pliku? Jak zacznie pobieranie kilka osób, to Out Of Memory gwarantowany!