2012-12-20 203 views
4

我正在制作一个项目,在其中用户点击产品时打开一个带有产品名称的模式窗口。我还希望将产品图像包含在面板内的模态窗口中。图像存储在我的服务器上的一个目录中。Wicket从文件系统创建图像

我指的是这个链接

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

ItemOrderPanel.html

 <div> 
      <li><a wicket:id="link"></a></li> 
     </div> 

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<ImageWriter> 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类这是返回字节。

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

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

回答

8

最后我解决了这个代码在ItemOrderPanel。java的

add(new NonCachingImage("img", new AbstractReadOnlyModel<DynamicImageResource>(){ 
      @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(); 

    } 
+1

我知道可用的,这是一个挑剔和我令人难以置信的抱歉,但你不需要在你的复制方法的try/catch,因为它抛出'IOException'无论如何,很好的答案,但绝对帮助我! – themanatuf

+0

是的,你写了感谢buddy –

+0

@CodeFish但你在哪里把路径?我没有看到..你有没有没有ImageResourceReference如上面的问题所示?只是“添加(..”语句在面板或什么?感谢您的答案 – ZelelB

3

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

1

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

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

还要确保你没有与很一般,像“/”,这可能具有更高优先级的网址中的其他资源或页面映射比“orderPage”。根据下面的Wiki页面:

首先询问具有较大IRequestMapper.getCompatibilityScore(Request)的映射器。

看这个页面的细节: How request mapping works in Wicket

应该正常工作了! ;)