2013-07-03 4 views
1

У меня есть сервлет ведьма генерирует .xls файл, а затем он посылает сгенерированный файл пользователю для загрузки на код ниже:Странный ответ сервлета вопрос

// Write the output to a file 
Calendar currentDate = Calendar.getInstance(); 
SimpleDateFormat formatter= 
new SimpleDateFormat("yyyy_MMM_dd"); 
String dateNow = formatter.format(currentDate.getTime()); 

String path = "webapps/myapp/exports/"; 
String fileName = ("Table_export_"+ dateNow + ".xls"); 

FileOutputStream fileOut = new FileOutputStream(path+fileName); 
wb.write(fileOut); 
fileOut.close(); 
response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition","attachment;filename="+fileName); 

Файл сохраняется на сервере с размер 5 кб, но после диалогового окна браузера и после выбора сохранения или открытия файл пуст, а размер - 0 кб. Я не понимаю, что случилось.

Я борюсь с этим вопросом около 2 часов без успеха. Я попытался установить полный путь:

response.setHeader("Content-Disposition","attachment;filename="path+fileName); 

Но я получил документ со странным названием, и это тоже было 0 кб.

Я уверен, что у меня что-то действительно малое, но как младший разработчик, я все еще не могу понять.

+1

Вы пытаетесь отправить файл в ответ HTTP или что? Извините, я не понимаю ваш код. – Rafa

+0

да, это то, что я пытаюсь сделать. – Slim

+1

Но вместо этого вы сохраняете файл в файловой системе! Если вы хотите отправить файл через HTTP, вы должны написать байты в 'OutputStream', которые вы получите из ответа HTTP. – AlexR

ответ

2

Поскольку у вас уже есть метод, который может записать файл в выходной поток, вы можете просто изменить этот код, чтобы отправить его пользователю:

Calendar currentDate = Calendar.getInstance(); 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MMM_dd"); 
String dateNow = formatter.format(currentDate.getTime()); 

String fileName = ("Table_export_"+ dateNow + ".xls"); 

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition","attachment;filename="+fileName); 

OutputStream outputStream = response.getOutputStream(); 
try { 
    wb.write(outputStream); 
} finally { 
    outputStream.close(); 
} 

Он не будет сохранен на сервере HDD.

Метод HttpServletResponse#getOutputStream() позволяет получить доступ к потоку байтов, который будет отправлен обратно клиенту.

+0

СПАСИБО ВАМ так барахло !!! Это то, что я искал! Ты жжешь! Еще раз спасибо! – Slim

0

Когда вы использовали формат -

String path = "webapps/myapp/exports/"; 
String fileName = ("Table_export_"+ dateNow + ".xls"); 
... 
response.setHeader("Content-Disposition","attachment;filename="path+fileName); 

был имя файла "WebApps% 2Fmyapps% 2Fexports% 2fTable_export _.... XLS"?

Als размер файла был бы ноль, потому что вы не прикладывая каких-либо данных в файле

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