![](/img/trans.png)
[英]Wicket create image from file system outside web application directory
[英]Wicket create images from file system
我正在創建一個項目,其中用戶單擊產品時將打開一個帶有產品名稱的模式窗口。 我還想在面板的模態窗口中包含產品圖像。 圖像存儲在我的服務器上的目錄中。
我指的是這個鏈接
我的面板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類 。
我想在面板上顯示圖片。 面板上顯示的鏈接就是我存儲在本地系統數據庫中的鏈接。
任何幫助和建議表示贊賞! 提前致謝。
最后,我在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();
}
使用DynamicImageResource並獲取以字節為單位的圖像。
我認為問題是您創建了兩個不同的ImageResourceReference實例(並且我認為這也是原始文章中的問題)。 因此,我將在您的ItemOrderPanel.java中執行以下操作:
WebApplication.get().
getResourceReferenceRegistry().
getResourceReference(
ImageResourceReference.class,
"imagesDemo",
null,
null,
null,
true,
false)
還要確保您沒有映射任何其他具有非常通用的URL的資源或頁面,例如“ /”,它可能比“ orderPage”具有更高的優先級。 根據下面的Wiki頁面:
首先要求具有更大的IRequestMapper.getCompatibilityScore(Request)的映射器。
請查看此頁面以獲取詳細信息: 請求映射在Wicket中的工作方式
那應該工作正常! ;)
https://cwiki.apache.org/WICKET/uploaddownload.html
您可以在此處找到一些信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.