2012-04-10 4 views
2

Я хочу загрузить документ MS Word 2003, который я создаю, с содержимым myString. Я использовал следующий код:Не удается загрузить файл с помощью HttpServletResponse

BufferedReader reader = new BufferedReader(new FileReader(templatePathFilename)); 
HttpServletResponse response = new MyHttpServletResponse(); 
response.setContentType ("application/msword"); 
response.setHeader ("Content-Disposition", "attachment; filename=\""+outgoingFileName); 
ServletOutputStream myOut = response.getOutputStream(); 
myOut.write(myString.getBytes()); 
myOut.flush(); 
myOut.close(); 

Но линия myOut.write(myString.getBytes()) дает NullPointerException. MyHttpServletResponse - это класс, который затмение создало по умолчанию, когда я быстро исправил возникшую ошибку. Нужно ли мне модифицировать этот класс? Может ли кто-нибудь помочь?

EDIT: Реальный код я сейчас работаю, как показано ниже:

BufferedReader reader = new BufferedReader(new FileReader(templatePathFilename)); 
String outgoingFileName = outputPathFilename; 
response.setContentType("application/msword"); 
response.setHeader("Content-Disposition", "attachment; filename="+outgoingFileName); 
OutputStream myOut = response.getOutputStream(); 
try { 
String thisLine; 
while ((thisLine = reader.readLine()) != null) { 
    if(thisLine.contains("##")) 
    { 
    for (java.util.Enumeration e = FrontSheetMap.keys(); e.hasMoreElements();{ 
    String name = (String) e.nextElement(); 
    String value = FrontSheetMap.get(name).toString(); 
    thisLine= thisLine.replaceAll("##" + name.toUpperCase() + "##", value); 
    } 
    } 
    myOut.write(thisLine); 
    myOut.write("\n"); 
    } 
    myOut.flush(); 
}catch(Exception e){} 

в то время как цикл заменяет заполнители во входном файле с требуемыми значениями и новое содержание в thisLine должно быть написано на выходе файл. Мне нужна опция загрузки, которая появляется при нажатии ссылки, которая выполняет этот код.

+1

Где моя строка объявлена ​​и определена? Кроме того, вы уверены, что это не значение, которое является нулевым? – jmort253

+1

Да, его не null. Функция не работает, даже если я пишу 'myOut.write (1234);' или 'myOut.write (" hello ".getBytes());' или любую другую строку непосредственно в нее. –

+1

Вам нужно, чтобы ваш читатель попал во что-то? Я вижу, что вы объявили его на первой строке, но я не вижу, где вы его использовали. Я не делал File IO в возрасте, но я предполагаю, что вы включили это по какой-то причине. – jmort253

ответ

2

Как вы упомянули MyHttpServletResponseэто класс, который затмение создало по умолчанию, когда я быстро исправил возникшую ошибку, что кажется проблемой.

Ваш код должен находиться внутри некоторого сервлета/JSP, а объект HttpServletResponse должен быть взят из контейнера (который передается методам service/doGet/doPost).

Что вы используете/фиктивная реализация по умолчанию из HttpServletResponse, который дает response.getOutputStream(); нулевой. Если вы используете объекты, предоставленные контейнером, ваша проблема будет решена.

+0

Спасибо, исключение NullPointerException больше не происходит. Но функция по-прежнему не отображает окно принятия решения, чтобы загрузить документ слова. Как я могу это достичь? –

+0

@SunmitGirme Same проблема. Любое решение? –

2

Если вы используете платформу Java EE для выполнения операции загрузки, то самым безопасным способом является ее выполнение через сервлет. Образец Скачать сервлет должен выглядеть, как показано ниже,

import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import java.io.*; 
import java.sql.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 

public class DownloadFile extends HttpServlet{ 
private static final long serialVersionUID = 1L; 
public void doGet(HttpServletRequest request, HttpServletResponse response)throws 
ServletException, IOException{ 
PrintWriter out = response.getWriter(); 
String fileName = request.getParameter("fileName"); 
fileName=fileName.substring(fileName.lastIndexOf("\\")+1,fileName.length()); 
String extension=fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()); 
String filePath = "C:/temp/"+fileName; 
FileInputStream fileToDownload = new FileInputStream(filePath); 
//ServletOutputStream output = response.getOutputStream(); 
if(extension.equalsIgnoreCase("txt")){ 
    response.setContentType("text/html"); 
} 
else if(extension.equalsIgnoreCase("doc")){ 
    response.setContentType("application/msword"); 
} 
else if(extension.equalsIgnoreCase("pdf")){ 
    response.setContentType("application/pdf"); 
} 
else if(extension.equalsIgnoreCase("jpg")){ 
    response.setContentType("image/jpeg"); 
} 
else if(extension.equalsIgnoreCase("jpeg")){ 
    response.setContentType("image/jpeg"); 
} 
response.setHeader("Content-Disposition","attachment; filename="+fileName); 
response.setContentLength(fileToDownload.available()); 
int c; 
while((c=fileToDownload.read()) != -1){ 
out.write(c); 
} 
out.flush(); 
out.close(); 
fileToDownload.close(); 
} 
} 
+0

Он не загружается. Код выполняется, но он должен вызывать всплывающее окно для сохранения файла, но это не так. –

+0

В приведенном выше коде вы можете видеть, что я читаю файл из местоположения сервера на «C: \ Temp» ok, поэтому вам нужно изменить «filePath» в соответствии с вашим требованием, любой да, этот сервлет будет генерировать диалоговое окно сохранения для сохраните файл в нужном месте. –

0

Добавить имя файла в заголовок, как показано ниже (Имя файл должен включать расширение, как если у вас есть слово документ с именем а имя файла должно быть abc.doc «т.е. extention "), нет необходимости проверять расширение, а затем установить тип содержимого

httpServletResponse.addHeader (« Content-Disposition »,« attachment; filename = » + имя_файла);

Оставшийся код не изменился и попробуйте сейчас, вы должны увидеть всплывающее окно с просьбой открыть этот документ.

Ниже приведен код snipet, который работает для меня

 OutputStream outputStream=httpServletResponse.getOutputStream(); 
     httpServletResponse.addHeader("Content-Disposition", "attachment; filename=" 
        + fileName); 



     //**Take the data from input stream and write it on outputstream 
     try{ 
      IOUtils.copy(documentumClientSession.getFile(fileName,dbpNum), outputStream); 
     }catch(Exception exp){ 
      exp.printStackTrace(); 
     } 

Я использую Apache Commons API, поэтому вы можете увидеть org.apache.commons.io.IOUtils используется класс, но вы можете заменить его с вашим собственным циклом в коде.

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