2012-04-10 372 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是eclipse默认生成的类,当我快速修复生成的错误时。我需要修改那个班吗? 任何人都可以请帮忙!

编辑:实际的代码我的工作是如下:

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){} 

while循环替换所需的值,在thisLine新的内容要在输出写入输入文件中的占位符文件。我需要一个下载选项,点击执行此代码的链接时弹出。

+1

myString在哪里被声明和定义?另外,你确定它不是那个值是空的吗? – jmort253 2012-04-10 05:43:42

+1

是的,它不为空。即使我将'myOut.write(1234);'或'myOut.write(“hello”.getBytes());'或任何其他字符串直接写入该函数,该函数也不起作用。 – 2012-04-10 05:45:48

+1

你的读者是否需要传递给某些东西?我看到你在第一行宣布了它,但是我没有看到你实际使用它的地方。我在很久以前没有完成File IO,但我假设你包含这个原因。 – jmort253 2012-04-10 05:47:24

回答

2

正如您所提到的MyHttpServletResponse是eclipse默认生成的类,当我快速修复产生的错误时,这似乎是问题所在。

你的代码应该位于某个servlet/JSP的内部,而HttpServletResponse对象应该从容器中取出(它传递给service/doGet/doPost方法)。

你正在使用的是什么HttpServletResponse的默认/虚拟实现,其中response.getOutputStream();为空。如果您使用容器提供的对象,您的问题将得到解决。

+0

谢谢,NullPointerException不占用任何人。但该功能仍然不会弹出决定框来下载word文档。我怎样才能做到这一点? – 2012-04-10 06:39:11

+0

@SunmitGirme同样的问题。任何解决方案 – 2016-08-24 07:35:04

2

如果您正在使用Java EE平台执行下载操作,那么最安全的方法是通过一个servlet来完成。 A样本下载的servlet应该如下,

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

它不下载。代码执行,但它应该弹出来保存文件,但它不会。 – 2012-04-10 06:49:19

+0

在上面的代码中,您可以看到我正在从“C:\ Temp”服务器位置读取文件,因此您必须根据您的要求更改“filePath”,任何yes此servlet将生成一个保存对话框将文件保存在您想要的位置。 – 2012-04-10 07:02:26

0

你的文件名添加到像下面的头(文件名应该包括一样,如果你有一个名为Word文档进一步扩展ABC的文件名应该是abc.doc“,即用),无需检查扩展名,然后设置内容类型

httpServletResponse.addHeader(“Content-Disposition”,“attachment; filename =” + fileName);

其余的代码保持不变,现在就试用它,你应该能够看到一个弹出窗口,要求你允许打开这个word文档。

以下是为我工作

 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的百科全书API,这就是为什么你可以看到org.apache.commons.io.IOUtils正在使用的类,但你可以取代它一小段代码片段在代码中使用自己的循环。