[英]How to display byte[] image in JSP using Struts2
我正在嘗試使用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在DB現有的圖像列表。
listImages.jsp
<s:if test="imageList.size() > 0">
<ul>
<s:iterator value="imageList">
<li><s:property value="imageData" /></li>
</s:iterator>
</ul>
</s:if>
使用此“屬性”標簽僅顯示一些與圖像字節數組關聯的字符串,例如“ [B @ 2eeb2d23”。 我的問題是:如何顯示可點擊的縮略圖或什至是URL而不是該字符串? 然后,當我單擊縮略圖或URL時,顯示完整尺寸的圖像。 我嘗試了許多不同的方法,但沒有一個起作用。 在上傳文件或將其保存在數據庫上時,可能是我做錯了。請提供有效的解決方案。 謝謝。
在HTML中,圖像和其他資源不是HTML頁面的一部分,而是由HTML頁面引用的。
因此,您的HTML需要具有<img src="[URL TO THE IMAGE]"/>
而您的JSP類似於
<s:iterator value="imageList">
<img src="[DOWNLOAD_URL]?id=${imageId}"/>
</s:iterator>
其中DOWNLOAD_URL
將指向一個HttpServlet
,該HttpServlet
根據其ID提供圖像數據。
使用此解決方案找到了部分解決方法: http : //java.dzone.com/articles/struts2-tutorial-part-67
因此,基本上我不再將圖像的字節數組保存到DB。 通過Struts上載圖像時,我只將圖像的文件名保存到DB中,然后制作圖像的副本(因為臨時圖像將在上載操作結束后不久被刪除),然后按照以下說明將副本保存在服務器上上面提供的教程。 然后,為了顯示某個圖像,我從數據庫中查詢了它的名稱,然后在將其上傳到服務器上時從第一次復制它的位置檢索了它。 感謝SJuan76的提示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.