2015-12-31 2 views
1

Здравствуйте я использую этот XAgent с этим SSJS кода для потоковой передачи файла из файловой системы сервера:ServletOutputStream поток ошибок динамической памяти большой файл

var filepath="c:/test/file.pdf" //380MB of file 
var extContext:javax.faces.context.ExternalContext = facesContext.getExternalContext(); 
var response:com.ibm.xsp.webapp.XspHttpServletResponse = extContext.getResponse(); 
var writer:javax.servlet.ServletOutputStream = response.getOutputStream(); 
    [email protected](filepath,3).toLowerCase(); 
    [email protected](filepath,"/"); 
    contentype="application/octet-stream"; 
    contentype=(estensione=="pdf")?"application/pdf":contentype; 
    response.setContentType(contentype); // content type of data, for other binary see mime types or put "application/octet-stream" 
    response.setHeader("Cache-Control", "no-cache"); 
    var filestream:java.io.File = new java.io.File(filepath); //for check file size 
    var maxfilesize:long=20*1024*1024; 
    var typestream= filestream.length()>maxfilesize?"attachment;":"inline;"; 
    response.setHeader("Content-Disposition" ,typestream+" filename=\"" + fileName+"\""); //31/12/2015 required if You need to pass it back as file 
    response.setHeader("Content-Length", ""+filestream.length()); 
    var inStream:java.io.FileInputStream = new java.io.FileInputStream(filepath); 
    var btbuffer:byte= new byte[32767]; 
    var ilen,bytesBuffered:int=0; 
    while ((ilen=inStream.read(btbuffer))!=-1){ 
     writer.write(btbuffer,0,ilen) 
     writer.flush(); //31/12/2015 - flush writer but don't work 
    } 
    inStream.close(); 
    writer.close(); 
    facesContext.responseComplete(); 

Кодекса работы correctly..but, когда у нас есть 2 или больше загрузить в то же время, сервер show HTTP JVM: java.lang.OutOfMemoryError:, потому что у меня 1024M NOTES.INI настройка.

Действительно проблема ServletOutputStream, которая использует общий размер файла в памяти javaheap и освобождает его после завершения загрузки или отмены загрузки клиента. У кого-то есть идея, как исправить? Я прочел это question и this question без каких-либо успехов.

ОБНОВЛЕНИЕ 4 января 2016

Я решить проблему с этой строки кода после задания ответа:

response.disableXspCache(false); 

ложный параметр является обязательным!

Наконец я слишком удалить код writer.close()

Спасибо Sven this blog и замечанию Riand Philippe

ответ

2

XPages среда не по умолчанию буферного результата страницы, пока вся страница будет завершена. Это позволяет во время выполнения полностью вернуть результат в случае ошибки и исправить сообщение об ошибке. Это делается с помощью XspHttpServletResponse.

Вы можете изменить это поведение, отбросив ответ и вызывающий disableXspCache() в этом классе.

+0

Спасибо, Филипп Рианд ..., когда я использую функцию disableXspCache(), mycode работает неправильно. –

+0

Итак, если вы не вписываетесь в память, увеличьте размер кучи с помощью настроек notes.ini. Используйте 64-битный домино, чтобы избежать ограничения 2G. –

+0

Я решаю проблему! см. сообщение UPDATE –

Смежные вопросы