我需要在我的vaadin 7 web应用程序中检索已使用的ressource的url,在我的情况下,ressource是
可以位于VAADIN/themes/themename/img
文件夹中的图像,也可以在jar文件中创建。
所以我想写的方法有这个签名:
/**
* Returns the URL for an image described with its name
*/
public String getURL(String image) {
...
}
答案 0 :(得分:0)
因为罐子可能会很慢 您应该使用所需的文件类型填充先前的列表。
public String getURL(String image) {
String realPath = VaadinServlet.getCurrent().getServletContext().getRealPath("/");
List<String> list = new ArrayList<String>();
search(image, new File(realPath), realPath, "", list);
if (list.isEmpty()) {
return null; // or error message
}
VaadinServletRequest r = (VaadinServletRequest) VaadinService.getCurrentRequest();
return r.getScheme() + "://" + r.getServerName() + ":" + r.getServerPort()
+ r.getContextPath() + list.get(0); // or return all
}
private void search(String image, File file, String fullPath, String relPath, List<String> list) {
if (file.isDirectory()) {
for (String subFile : file.list()) {
String newFullPath = fullPath + "/" + subFile;
search(image, new File(newFullPath), newFullPath, relPath + "/" + subFile, list);
}
} else {
if (image.equals(file.getName())) {
list.add(relPath);
}
if (file.getName().endsWith(".jar")) {
ZipInputStream zis = null;
try {
zis = new ZipInputStream(new FileInputStream(fullPath));
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
String name = entry.getName();
if (name.equals(image) || name.endsWith("/" + image)) {
list.add("/" + name);
}
}
} catch (Exception e) {
// error handling
} finally {
IOUtils.closeQuietly(zis);
}
}
}
}