3

コンテンツを含む作成中のMSWord2003ドキュメントをダウンロードしたい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プラットフォームを使用してダウンロード操作を実行している場合、最も安全な方法はサーブレットを介して実行することです。サンプルのダウンロードサーブレットは次のようになります。

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 に、私が生成されたエラーを素早く修正したときに日食がデフォルトで生成したクラスです、それは問題のようです。

コードはサーブレット/JSP内にあり、HttpServletResponseオブジェクトはコンテナから取得する必要があります(これはservice / doGet / doPostメソッドに渡されます)。

使用しているのは、デフォルト/ダミーの実装であり、nullとしてHttpServletResponse提供されます。response.getOutputStream();コンテナ提供のオブジェクトを使用すると、問題は解決します。

于 2012-04-10T06:08:33.920 に答える
0

以下のようにファイル名をヘッダーに追加します(ファイル名には、abcという名前の単語ドキュメントがある場合のように拡張子を含める必要があります。ファイル名はabc.doc "ie withextension"である必要があります)。拡張子を確認してからコンテンツタイプを設定する必要はありません。

httpServletResponse.addHeader( "Content-Disposition"、 "attachment; filename =" + fileName);

残りのコードは同じままで、今すぐ試してください。この単語のドキュメントを開く許可を求めるポップアップが表示されるはずです。

以下は私のために働いているコードスニペットです

        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();
        }

私はapachecommonsapiを使用しているため、使用されているクラスorg.apache.commons.io.IOUtilsを確認できますが、コード内で独自のループに置き換えることができます。

于 2013-02-06T08:03:53.203 に答える