我正在尝试使用Struts2在JSP中显示字节数组图像。 首先,图像上传如下:
saveImage.jsp
<s:form action="saveImage" enctype="multipart/form-data" method="POST">
<s:file name="file"/>
</s:form>
struts.xml中
<action name="saveImage" class="com.actions.ImageAction" method="save">
<result name="success" type="redirect">listImages</result>
</action>
<action name="listImages" class="com.actions.ImageAction" method="list">
<result name="success">listImages.jsp</result>
</action>
ImageAction.class
public class ImageAction extends ActionSupport implements ModelDriven<Image> {
private Image = new Image();
private File file;
private List<Image> imageList = new ArrayList<>();
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public File getFile() {
return file;
}
public List<Image> getImageList() {
return imageList;
}
public void setImageList(List<Image> imageList) {
this.imageList = imageList;
}
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = null;
@SkipValidation
public String save() {
try {
session = sessionFactory.openSession();
session.beginTransaction();
byte[] byteFile = new byte[(int) file.length()];
try {
FileInputStream fs = new FileInputStream(file);
fs.read(byteFile);
fs.close();
} catch (Exception e) {}
image.setImageData(byteFile);
session.saveOrUpdate(image);
session.getTransaction().commit()
} catch (Exception e) {
session.getTransaction().rollback();
} finally {
session.close();
}
return SUCCESS;
}
@SkipValidation
public String list() {
try {
session = sessionFactory.openSession();
session.beginTransaction();
imageList = session.createQuery("from Image").list();
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
} finally {
session.close();
}
return SUCCESS;
}
@Override
public Image getModel() {
return image;
}
}
Image对象具有 byte [] imageData 属性,并使用Hibernate保存到DB。 现在,在成功将图像字节数组保存到DB后,Struts调用 listImages 操作,该操作在 listImages.jsp 中显示数据库中的现有图像列表。
listImages.jsp
<s:if test="imageList.size() > 0">
<ul>
<s:iterator value="imageList">
<li><s:property value="imageData" /></li>
</s:iterator>
</ul>
</s:if>
使用这个“property”标签只显示一些与图像字节数组相关的字符串,例如“[B @ 2eeb2d23”。我的问题是:如何显示可点击的缩略图甚至是URL而不是该字符串?然后,当我单击缩略图或URL时,显示完整大小的图像。我尝试了很多不同的方法,但没有一种方法有效。也许这是我在上传文件或将其保存在数据库上时做错了...请提供一个有效的解决方案。感谢。
答案 0 :(得分:1)
在HTML中,图像和其他资源不是HTML页面的一部分,而是由它引用。
因此,您的HTML需要<img src="[URL TO THE IMAGE]"/>
,而您的JSP将类似于
<s:iterator value="imageList">
<img src="[DOWNLOAD_URL]?id=${imageId}"/>
</s:iterator>
其中DOWNLOAD_URL
将指向基于其ID提供图像数据的HttpServlet
。
答案 1 :(得分:0)
使用此解决方案找到部分解决方法:http://java.dzone.com/articles/struts2-tutorial-part-67
所以基本上我不再将图像的字节数组保存到DB了。通过struts上传图像时,我只将图像的文件名保存到DB中,然后复制图像(因为临时图像将在上传操作结束后立即删除)并将副本保存在服务器上,如下所述上面提供的教程。然后,为了显示某个图像,我从DB查询它的名字,然后在我第一次将它复制到服务器上时从我复制它的位置检索它。感谢SJuan76的暗示。