3

我想下载我正在使用其中的内容创建的 MS Word 2003 文档myString。我使用了以下代码:

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写入输出文件。我需要一个下载选项,单击执行此代码的链接会弹出该选项。

4

3 回答 3

3

如果您使用 Java EE 平台来执行下载操作,那么最安全的方法是通过 servlet 来完成。示例下载 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();

        // Prepare the File Read.
        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);

        // Prepare the Headers.
        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());

        // Download the file.
        int c;
        while ((c = fileToDownload.read()) != -1) {
            out.write(c);
        }
        out.flush();
        out.close();
        fileToDownload.close();
    }
}
于 2012-04-10T06:40:19.707 回答
2

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

您的代码应该在某个 servlet/JSP中,并且 HttpServletResponse 对象应该从容器中获取(它被传递给 service/doGet/doPost 方法)。

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

于 2012-04-10T06:08:33.920 回答
0

将您的文件名添加到标题中,如下所示(文件名应包括扩展名,如果您有一个名为 abc 的 word 文档,文件名应为 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 commons api,这就是为什么您可以看到 org.apache.commons.io.IOUtils 正在使用的类,但您可以在代码中用自己的循环替换它。

于 2013-02-06T08:03:53.203 回答