私はFreeMarkerを少しずつ使ってきましたが、欠けている機能が1つしかないか、わかりません。 cfg.getTemplate()に絶対パスを渡すと、それは機能しません。私はあなたがテンプレートディレクトリを指定することができますが、私はそれを行う余裕がないことを知っています、私のユースケースは、任意のディレクトリ内のファイルを扱うことができます。どのような方法でも絶対パスをレンダリングするFreeMarkerを設定する方法はありますか?FreeMarkerで絶対パスを使用する
答えて
Antスクリプトでテンプレートが実行されていて、テンプレートがファイルシステム上にあり、Antファイルセットで検出されたため、絶対パスを使用する必要がありました。
public class TemplateAbsolutePathLoader implements TemplateLoader {
public Object findTemplateSource(String name) throws IOException {
File source = new File(name);
return source.isFile() ? source : null;
}
public long getLastModified(Object templateSource) {
return ((File) templateSource).lastModified();
}
public Reader getReader(Object templateSource, String encoding)
throws IOException {
if (!(templateSource instanceof File)) {
throw new IllegalArgumentException("templateSource is a: " + templateSource.getClass().getName());
}
return new InputStreamReader(new FileInputStream((File) templateSource), encoding);
}
public void closeTemplateSource(Object templateSource) throws IOException {
// Do nothing.
}
}
と初期化は次のとおりです:私は、これらは非常にいくつかのユニークな要件...とにかく
あり、(限りSOアップしている)後世のために、ここで機能するソリューションだと思う
public String generate(File template) {
Configuration cfg = new Configuration();
cfg.setTemplateLoader(new TemplateAbsolutePathLoader());
Template tpl = cfg.getTemplate(template.getAbsolutePath());
// ...
}
FreemarkerはデフォルトでFileTemplateLoaderを使用しています。これは "base"ディレクトリの外からテンプレートを取得することを許可しません(デフォルトでは 'user.dir'システムプロパティから取得されるため、あなたのホームディレクトリです)。あなたにできることは次のとおりです。
- 明示的BASEDIRとFileTemplateLoaderを作成するテンプレートを取得することがありますその下からあなたの最上位ディレクトリに設定します(理論的には、絶対パスを使用するためにはルートに設定することができますが、それはですセキュリティの観点からは非常に悪いこと©)。
- 絶対パスを使用するテンプレートローダーを作成しますが、テンプレートがテンプレートフォルダ内にあることを確認してください。それを行う場合は、正規のファイルパスを比較するよう注意してください。
- あなたのアプローチを再考してください。テンプレートの絶対パスが本当に必要ですか?
おかげでソリューションを使用した方が良いと思います。毎回テンプレートディレクトリを変更するだけでしたが、カスタムFileTemplateLoaderを作成する方がより適切な方法で処理できます。 Webページの生成にセキュリティホールが使用されているのはなぜか分かりますが、通常のユーザーが実行しているプログラムであれば、標準のLinux権限が十分に予防対策になるはずです。 – dimo414
あなたの許可が適切に設定されている限り、そうかもしれません。私はまだあなたが絶対パスを使用する理由を想像することはできません...テンプレートをいくつかの共通の(ルートではない)フォルダの下に置くか、ユーザごとにカスタマイズ可能な場合は、ユーザーの家。しかし、私はあなたの理由があると確信しています - あなたの実装に幸運。 – ChssPly76
実際に、それはあなたが
public Object findTemplateSource(String name) throws IOException {
File source = new File("/" + name);
return source.isFile() ? source : null;
}
中に問題が発生し、それを再度追加する必要がありますので、「/」先頭を削除TemplateLoaderが使用される前にFreeMarkerでパス名が破棄されているという解決法があります。 TemplateCacheを参照してください:
name = normalizeName(name);
if(name == null) {
return null;
}
Template result = null;
if (templateLoader != null) {
result = getTemplate(templateLoader, name, locale, encoding, parseAsFTL);
}
だから私は例えば提案in this answer
として答えを
Configuration config = new Configuration();
File templateFile = new File(templateFilename);
File templateDir = templateFile.getParentFile();
if (null == templateDir){
templateDir = new File("./");
}
config.setDirectoryForTemplateLoading(templateDir);
Template template = config.getTemplate(templateFile.getName());
- 1. 絶対パスでchdirを使用する
- 2. プライベートパスのプロービングで絶対パスを使用
- 3. 絶対パスと絶対パスの比較
- 4. 絶対パスRewriteRule
- 5. 絶対パス
- 6. 絶対パスのMkdir()絶対パスでのMkdir()
- 7. 絶対パスの代わりに相対パスを使用する方法?
- 8. エレクトロンで絶対パスを使用できますか?
- 9. Node.js:相対パスと絶対パス
- 10. 絶対パスを指すリンク
- 11. サーブレットは:絶対パス
- 12. Mojolicious url_for:絶対パス
- 13. Windows CMD:絶対パスから相対パスを取得する
- 14. linuxの絶対パスを相対パスに変換する方法
- 15. リンクテーブルを相対パスへの絶対パスに変更する
- 16. PHPの絶対パスをrequireonce
- 17. Javaでパスが相対パスか絶対パスかをチェックする方法
- 18. インポートに絶対パスを使用できませんか?
- 19. Apache/PHP:Windowsの絶対パスを使用しているfile_put_contents? (可能?)
- 20. 絶対パスとフルパスを管理する
- 21. Pythonの絶対パスを確認する
- 22. 絶対パスを作成するネットワークパス - asp.net
- 23. Pythonの相対パスからの絶対パスを見つける
- 24. のApacheのErrorDocument絶対パス
- 25. Antのプロパティファイルの絶対パス
- 26. Eclipseプラグインフォルダの絶対パス
- 27. Vim 'tags'オプションの絶対パス
- 28. JSFイメージと絶対パス
- 29. Asp.Net URLの絶対パス
- 30. nginxのerror_pageの絶対パス?
ありがとうございます。私はもはやこのプロジェクトを開発していないので、私はこれをテストすることはできませんが、私は同じ質問を持っている誰もがこれを感謝するだろうと確信しています。 – dimo414
コミュニティが同意しているように私はあなたの答えを受け入れました。 – dimo414