2012-04-10 24 views
2

コンテンツをmyStringで作成しているMS Word 2003文書をダウンロードします。 私は、次のコードを使用しています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はどこで宣言され定義されていますか?また、その値がnullではないと確信していますか? – jmort253

+1

はい、そのnullではありません。この関数は、myOut.write(1234);やmyOut.write( "hello" .getBytes());や他の文字列を直接書き込んでも機能しません。 –

+1

あなたの読者は何かに渡す必要がありますか?私はあなたが最初の行でそれを宣言したのを見ますが、実際にどこを使ったか分かりません。私は年齢でFile IOを行っていませんが、あなたがそれを理由で含めると仮定しています。 – jmort253

答えて

2

あなたが言及したようにMyHttpServletResponseは、エラーが発生したときにデフォルトで生成されるクラスです、これは問題のようです。

あなたのコードはいくつかのサーブレット/ JSPの中に置かれ、HttpServletResponseオブジェクトはコンテナ(service/doGet/doPostメソッドに渡されます)から取得する必要があります。使用している何

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

+0

ありがとうございます。NullPointerExceptionはそれ以上発生しません。しかし、この機能は依然として単語文書をダウンロードするための決定ボックスをポップアップしない。それをどうすれば実現できますか? –

+0

@SunmitGirme同じ問題です。どんな解決策ですか? –

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"というサーバーの場所からファイルを読み込んでいますので、必要に応じて "filePath"を変更する必要があります。このサーブレットは保存ダイアログボックスを生成します目的の場所にファイルを保存します。 –

0

は、以下のようなヘッダに自分の名を追加します。あなたは、ABCファイル名という名前のWord文書を持っている場合abc.doc「すなわちでなければなりませんように(ファイル名には拡張子を含める必要がありますエクステンションをチェックする必要はなく、コンテンツタイプを設定する必要はありません。

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

残りのコードは同じままで今すぐ試してください。あなたはこの単語の文書を開くためのあなたの許可を求めるポップアップを見ることができます。以下は

私はあなたがクラスが使用されてorg.apache.commons.io.IOUtilsを見ることができる理由ですが、あなたはそれを置き換えることができますApacheのコモンズのAPIを使用しています私

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

のために働いているコードsnipetですコード内に独自のループがあります。

関連する問題