5

PDFファイルに画像を追加しようとしています。画像は「WebContent/img/image.png」にあります。最初に相対パスを文字列に保存し、次にこの相対パスを実際のパスに変換します。

String relativeWebPath = "/img/image.png";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
Image image1 = Image.getInstance(absoluteDiskPath);

これでも

String absoluteDiskPath = getServletContext().getRealPath("/");

動作しません。

相対パスを定義するときにいくつかのバリエーションを試しましたが、どれも機能させることができませんでした。String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);この行を実行しようとすると、常にnullPointerExceptionが発生します。相対パスなどで何か問題がありますか?これが適切かどうかはわかりませんが、Springを使用しています。

@RequestMapping(value = "/exportPhonebook.html", method = RequestMethod.POST)
public void exportPhonebook(Model model, HttpServletResponse response) {
    try {
        setResponseHeaderPDF(response);
        Document document = new Document();
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter pdfWriter = null;
        pdfWriter = PdfWriter.getInstance(document, baosPDF);
        PageNumbersEventHelper events = new PageNumbersEventHelper();
        pdfWriter.setPageEvent(events);
        document.open();
        addMetaData(document);
        addTitlePage(document);
        String relativeWebPath = "/img/image.png";
        String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
        Image image1 = Image.getInstance(absoluteDiskPath);
        document.add(image1);
        addContent(document);
        document.close();
        pdfWriter.close();
        OutputStream os = response.getOutputStream();
        baosPDF.writeTo(os);
        os.flush();
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

これは私がjspでそれを使用した方法です:

<input type="hidden" value="<%=getServletContext().getRealPath("/") %>" name="path">

これをコントローラーに渡し、このパスに相対パスを追加します。

path = path + "img\\image.png";
Image image = Image.getInstance(path);

これは問題なく動作します。これが私のコントローラーで機能しない理由がわかりません。

4

3 に答える 3

9

私はこれを逃していました:

ServletContext servletContext = request.getSession().getServletContext();

今ではコントローラーから動作します。

ServletContext servletContext = request.getSession().getServletContext();
String relativeWebPath = "img/image.png";
String absoluteDiskPath = servletContext.getRealPath(relativeWebPath);
于 2013-03-26T14:06:18.057 に答える
0

フォルダ構造内の複数の場所に存在する可能性があるため、/WEB-INF/フォルダから相対パスを開始してみてください。次に、絶対パスを取得するにはどうすればよいでしょうか。/img/image.png

getRealPath()に関するドキュメントの状態を参照してください。

サーブレットコンテナが指定された仮想パスを実際のパスに変換できない場合、このメソッドはnullを返します。

つまり、使用する前に戻り値を確認する必要があります。

于 2013-03-25T14:36:43.793 に答える
0

http://ananthkannan.blogspot.ru/2009/12/servletcontextgetrealpath-returns-null.html

webappがWARとしてデプロイされている場合のweblogicのもう1つの奇妙な動作。ServletContext.getRealPath()は、WARとしてデプロイされた場合はnullを返しますが、展開された場合は正常に機能します。WARとしてデプロイしたいが、この問題を解決したい場合は、この問題を修正する方法が2つあります。1。サーバー管理コンソール->ドメイン->Webアプリケーションに移動します。Archived RealPathEnabledのチェックボックスをクリックします。これにより、以下のようにドメインconfig.xmlにエントリが作成されます。true

  1. 2番目のオプションは、以下のようにweblogic.xmlを更新することにより、webappレベルになります。trueWebアプリで設定された値は、ドメインレベルで設定された値よりも優先されます。このプロパティのデフォルト値はfalseです。
于 2015-05-15T13:17:39.550 に答える