Wicket从文件系统创建图像

我正在制作一个项目,用户在点击产品时打开一个带有产品名称的模态窗口。 我还想在面板内的模态窗口中包含产品图像。 图像存储在我的服务器上的目录中。

我指的是这个链接

我的面板html代码看起来像这样http://wicketinaction.com/2011/07/wicket-1-5-mounting-resources/

ItemOrderPanel.html

  • ItemOrderPanel.java

      final ResourceReference imageResourceReference = new ImageResourceReference(); String imageName = itm.getProductImage(); final PageParameters parameters = new PageParameters(); parameters.set("name", imageName); CharSequence urlForImage = getRequestCycle().urlFor(imageResourceReference,parameters); ExternalLink link = new ExternalLink("link", urlForImage.toString()); link.setBody(Model.of(imageName)); add(link); 

    在WicketApplication.java中

     mountResource("/orderPage/{name}",new ImageResourceReference()); 

    我对WicketApplication.java中的这一行有疑问。

    我已经创建了这样的资源文件

    ImageResourceReference.java

     public class ImageResourceReference extends ResourceReference{ public ImageResourceReference(){ super(ImageResourceReference.class,"imagesDemo"); } @Override public IResource getResource() { return new ImageResource(); } private static class ImageResource extends DynamicImageResource{ private static final long serialVersionUID = 1L; @Override protected byte[] getImageData(Attributes attributes) { PageParameters parameters = attributes.getParameters(); StringValue name = parameters.get("name"); byte[] imageBytes = null; if(name.isEmpty() == false) imageBytes = getImageAsBytes(name.toString()); return imageBytes; } private byte[] getImageAsBytes(String label){ BufferedImage image = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); Graphics2D g = (Graphics2D) image.getGraphics(); g.setColor(Color.BLACK); g.setBackground(Color.WHITE); g.clearRect(0, 0, image.getWidth(), image.getHeight()); //g.setFont(new Font("SansSerif", Font.PLAIN, 48)); g.drawString(label, 50, 50); g.dispose(); Iterator writers = ImageIO.getImageWritersByFormatName("jpeg"); ImageWriter writer = writers.next(); if (writer == null) { throw new RuntimeException("JPG not supported?!"); } final ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] imageBytes = null; try { ImageOutputStream imageOut = ImageIO.createImageOutputStream(out); writer.setOutput(imageOut); writer.write(image); imageOut.close(); imageBytes = out.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return imageBytes; } @Override public boolean equals(Object that){ return that instanceof ImageResource; } } 

    }

    但是当我调试代码时,我发现控件不会返回到返回字节的内部ImageResource类

    我想在我的面板上显示图像图片。 我面板上显示的链接是我存储在本地系统数据库中的链接。

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

    最后,我在ItemOrderPanel.java中解决了这个代码

     add(new NonCachingImage("img", new AbstractReadOnlyModel(){ @Override public DynamicImageResource getObject() { DynamicImageResource dir = new DynamicImageResource() { @Override protected byte[] getImageData(Attributes attributes) { StringValue name = parameters.get("name"); byte[] imageBytes = null; if(name.isEmpty() == false) imageBytes = getImageAsBytes(name.toString()); return imageBytes; } }; dir.setFormat("image/png"); return dir; } })); private byte[] getImageAsBytes(String label){ byte[] imageBytes = null; try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); InputStream inStream = new FileInputStream(new File(label)); copy(inStream, outStream); inStream.close(); outStream.close(); return outStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return imageBytes; } private void copy(InputStream source, OutputStream destination) throws IOException { // Transfer bytes from source to destination byte[] buf = new byte[1024]; int len; while ((len = source.read(buf)) > 0) { destination.write(buf, 0, len); } source.close(); destination.close(); } 

    使用DynamicImageResource并以字节为单位获取图像。

    https://cwiki.apache.org/WICKET/uploaddownload.html

    你可以在这里找到一些信息。

    我认为问题是你创建了两个不同的ImageResourceReference实例(我认为这也是原始文章中的一个问题)。 所以我会在你的ItemOrderPanel.java中执行以下操作:

     WebApplication.get(). getResourceReferenceRegistry(). getResourceReference( ImageResourceReference.class, "imagesDemo", null, null, null, true, false) 

    另外,请确保您没有使用非常通用的URL映射任何其他资源或页面,例如“/”,其优先级高于“orderPage”。 根据下面的Wiki页面:

    首先询问具有更大IRequestMapper.getCompatibilityScore(请求)的映射器。

    请查看此页面以获取详细信息: 请求映射如何在Wicket中运行

    它应该工作正常! ;)