image - 来自文件系统的 Wicket 服务图像

标签 image wicket resourcereference

我对 Wicket 很陌生,在使用资源引用时遇到了一些困难。我正在使用 wicket 1.5.4 并有以下问题:我将图像存储在文件系统上。我有类 ImageElement,它保存了相对于配置的 rootFilePath(即 dir1/dir2/img1.png)的文件路径的一部分。在页面上,我添加 Image 如下:

new Image("id",ImagesResourceReference.get(), pageParameters)

其中页面参数包括图像路径参数(path="/dir1/dir2/img1.png")。我的问题是:
  • 这是从文件系统提供图像的最简单方法吗?
  • 可以将 ResourceReference 与静态方法一起使用吗?或者我每次都应该构造新的ResourceReference?我看到在以前的版本中可以使用 new ResourceReference(globalId),但现在似乎不再如此。如果是这样,全局资源引用的用途是什么?据我了解,资源引用应该是资源工厂,因此为每个资源请求创建新工厂会很奇怪。
  • 最后一个问题是,如何以更好的方式将路径传递到图像,以便一旦在 ImageResource 上调用响应方法,我就不必连接索引参数来构建路径。
  • 让它以高效和简单的方式工作的最佳方案是什么,我在“Wicket in action”中看到了这个例子,但这意味着从数据库生成动态图像,我不确定它是否适合我的情况

  • 我在“/images”路径下的 Application 中安装的 ResourceReference 实现如下所示:

    public class ImagesResourceReference extends ResourceReference {
    
    private static String rootFileDirectory;
    
    private static ImagesResourceReference instance;
    
    private ImagesResourceReference() {
        super(ImagesResourceReference.class, "imagesResourcesReference");
    }
    
    public static ImagesResourceReference get() {
        if(instance == null) {
            if(StringUtils.isNotBlank(rootFileDirectory)) {
                instance = new ImagesResourceReference();
            } else {
                throw new IllegalStateException("Parameter configuring root directory " +
                        "where images are saved is not set");
            }
        }
        return instance;
    }
    
    public static void setRootFileDirectory(String rootFileDirectory) {
        ImagesResourceReference.rootFileDirectory = rootFileDirectory;
    }
    
    private static final long serialVersionUID = 1L;
    
    @Override
    public IResource getResource() {
    
        return new ImageResource(rootFileDirectory);
    }
    
    private static class ImageResource implements IResource {
    
        private static final long serialVersionUID = 1L;
    
        private final String rootFileDirectory;
    
        public ImageResource(String rootFileDirectory) {
            this.rootFileDirectory = rootFileDirectory;
        }
    
        @Override
        public void respond(Attributes attributes) {
    
             PageParameters parameters = attributes.getParameters();
             List<String> indexedParams = getAllIndexedParameters(parameters);
             if(!indexedParams.isEmpty() && isValidImagePath(indexedParams)) {
                 String pathToRequestedImage = getImagePath(indexedParams);
                 FileResourceStream fileResourceStream = new FileResourceStream(new File(pathToRequestedImage));
                 ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
                 resource.respond(attributes);
             }
        }
    
        private boolean isValidImagePath(List<String> indexedParams) {
            String fileName = indexedParams.get(indexedParams.size() -1);
            return !FilenameUtils.getExtension(fileName).isEmpty();
        }
    
        private List<String> getAllIndexedParameters(PageParameters parameters) {
            int indexedparamCount = parameters.getIndexedCount();
            List<String> indexedParameters = new ArrayList<String>();
            for(int i=0; i<indexedparamCount ;i++) {
                indexedParameters.add(parameters.get(i).toString());
            }
            return indexedParameters;
        }
    
        private String getImagePath(List<String> indexedParams) {
            return rootFileDirectory + File.separator + StringUtils.join(indexedParams, File.separator);
        }
    
    }
    

    任何帮助和建议表示赞赏!提前致谢。

    最佳答案

    您可以将其用作共享资源:

        public class WicketApplication extends WebApplication {
            @Override
            public Class<HomePage> getHomePage() {
                return HomePage.class;
            }
            @Override
            public void init() {
                super.init();
                getSharedResources().add("downloads", new FolderContentResource(new File("C:\\Users\\ronald.tetsuo\\Downloads")));
                mountResource("downloads", new SharedResourceReference("downloads"));
            }
            static class FolderContentResource implements IResource {
                private final File rootFolder;
                public FolderContentResource(File rootFolder) {
                    this.rootFolder = rootFolder;
                }
                public void respond(Attributes attributes) {
                    PageParameters parameters = attributes.getParameters();
                    String fileName = parameters.get(0).toString();
                    File file = new File(rootFolder, fileName);
                    FileResourceStream fileResourceStream = new FileResourceStream(file);
                    ResourceStreamResource resource = new ResourceStreamResource(fileResourceStream);
                    resource.respond(attributes);
                }
            }
        }
    

    关于image - 来自文件系统的 Wicket 服务图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229976/

    相关文章:

    css - React Native - 图像半圆(使用 CSS)

    java - 检测两个图像之间的变化(检测新对象的出现)

    java - Wicket - Ajax PropertyListView

    java - 如何在 Wicket 中创建可靠的调色板

    java - 如何控制 Wicket 口将项目添加到标题的位置?

    java - Wicket 中的 ResourceReferences 是什么,它们是如何工作的?

    c# - 在低质量图像中查找简单对象

    javascript - 使用点击功能交换图像

    Java Wicket 资源问题