簡體   English   中英

如何使用Struts2在JSP中顯示byte []圖像

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM