0

なんとかデータベースに画像を保存できましたが、もう一度画像を取得/表示したいと思います。方法がわかりません。基本的に私の質問は、ImageDao でさらにメソッドが欠落しているかどうか、または jsp の構成がどのように見えるかです。

私の画像クラスがあります:

package de.hdu.pms.model;

import java.sql.Blob;
import java.util.Date;
import java.util.Set;

import javax.persistence.*;


@Entity
@Table(name="tbl_image")
public class Image {
     @Id
     @GeneratedValue
     @Column(name="image_id")
      private Integer id;


        private String name;


        private String description;


        private String filename;

        @Column(name="content", columnDefinition="mediumblob")
        @Lob
        private Blob content;


        private String contentType;

        private Date created;

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getFilename() {
            return filename;
        }

        public void setFilename(String filename) {
            this.filename = filename;
        }

        public Blob getContent() {
            return content;
        }

        public void setContent(Blob content) {
            this.content = content;
        }

        public String getContentType() {
            return contentType;
        }

        public void setContentType(String contentType) {
            this.contentType = contentType;
        }

        public Date getCreated() {
            return created;
        }

        public void setCreated(Date created) {
            this.created = created;
        }



}

画像ダオ

package de.hdu.pms.dao;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;



import de.hdu.pms.model.Image;


public class ImageDao extends HibernateDaoSupport {


        public void save(Image image) {
            HibernateTemplate template = getHibernateTemplate();
            template.saveOrUpdate(image);
        }

        @SuppressWarnings("unchecked")
        public List<Image> list() {
           HibernateTemplate template = getHibernateTemplate();
            //evtl ersetzen durch hibernate template
           @SuppressWarnings("rawtypes")
           List images=template.loadAll(Image.class);
            return images;
        }

        public Image get(Integer id) {
            HibernateTemplate template = getHibernateTemplate();
            return template.get(Image.class, id);
        }



     @Transactional
     //hibernate
        public void remove(Integer id) {
          HibernateTemplate template = getHibernateTemplate();

            Image image = template.get(Image.class, id);
             template.delete(image);
        }

}

イメージコントローラー:

package de.hdu.pms.ctrl;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.SQLException;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;



import de.hdu.pms.dao.CocktailDao;
import de.hdu.pms.dao.ImageDao;
import de.hdu.pms.model.Image;

@Controller
public class ImageController {

    @Autowired
    private ImageDao imageDao;

    public ImageDao getImageDao(){
        return imageDao;
    }

    public void setImageDao(ImageDao imageDao){
        this.imageDao = imageDao;
    }
    //aus dem Tutorial

     @RequestMapping("/EditImage.html")
     public String index(Map<String, Object> map) {
            try {
                map.put("image", new Image());
                map.put("imageList", imageDao.list());
            }catch(Exception e) {
                e.printStackTrace();
            }

            return "edit-image";
        }

        //aus dem Tutorial




     @RequestMapping(value = "/SaveImage.html", method = RequestMethod.POST)
        public String save(
                @ModelAttribute("image") Image image,
                @RequestParam("file") MultipartFile file) {


            System.out.println("Name:" + image.getName());
            System.out.println("Desc:" + image.getDescription());
            System.out.println("File:" + file.getName());
            System.out.println("ContentType:" + file.getContentType());

            try {
                Blob blob = Hibernate.createBlob(file.getInputStream());

                image.setFilename(file.getOriginalFilename());
                image.setContent(blob);
                image.setContentType(file.getContentType());
            } catch (IOException e) {
                e.printStackTrace();
            }

            try {
                imageDao.save(image);
            } catch(Exception e) {
                e.printStackTrace();
            }

            return "redirect:/AlleImages.html";
        }

        @RequestMapping("/download/{imageId}")
        public String download(@PathVariable("imageId")
                Integer imageId, HttpServletResponse response) {

            Image img = imageDao.get(imageId);
            try {
                response.setHeader("Content-Disposition", "inline;filename=\"" +img.getFilename()+ "\"");
                OutputStream out = response.getOutputStream();
                response.setContentType(img.getContentType());
                IOUtils.copy(img.getContent().getBinaryStream(), out);
                out.flush();
                out.close();

            } catch (IOException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }


            return null;
        }

        @RequestMapping(value="/AlleImages.html", method=RequestMethod.GET)
        public ModelAndView list(){
            ModelAndView mv = new ModelAndView();
            mv.addObject("title", "Images");
            mv.addObject("message", "Alle gespeicherten Images");
            mv.addObject("image", imageDao.list());
            // für die jsp bedingung 
            mv.addObject("edit",true);
            mv.setViewName("list-image");
            return mv;
        }


}

そして最後に、画像に「アクセス」したかった私のjspのコードスニペット-しかし、失敗しました:

                                                    <h3>Image List</h3>
                                                    <c:if  test="${!empty imageList}">
                                                    <table class="data">
                                                    <tr>
                                                        <th>Name</th>
                                                        <th>Description</th>
                                                        <th>&nbsp;</th>
                                                    </tr>
                                                    <c:forEach items="${imageList}" var="image">
                                                        <tr>
                                                            <td width="100px">${image.name}</td>
                                                            <td width="250px">${image.description}</td>
                                                            <td width="250px">${image.content}</td>


                                                        </tr>
                                                    </c:forEach>

誰かが私を助けてくれれば本当にありがたいです。ありがとう

4

1 に答える 1

0

問題は、HTTP と HTML がどのように機能するかを理解していることです。Web ページに画像が含まれている場合、HTML には画像のコンテンツが含まれていません。含まれているのは、imgこの画像の URL を含む src 属性を持つタグだけです。

<img src="/the/path/of/the/image.jpg"/>

ブラウザーは、HTML ページを取得するための最初の要求を送信します。次に、HTML を解析してimgタグを確認し、画像の URL に 2 番目のリクエストを送信して、そのコンテンツ (バイト) を取得して表示します。

コードは、BLOB (実際には、BLOB で toString() を呼び出した結果) を含む HTML ページをページに直接生成しようとします。

<td width="250px">${image.content}</td>

それは正しくありません。

生成する必要があるのは、データベースからイメージ バイトを取得してブラウザに送信するアクションの URL を src 属性に含むイメージ タグです。つまり、imgダウンロード アクションを指すタグです。

<td width="250px"><img src="<c:url value='/download/${image.id}'/>"/></td>
于 2013-06-29T21:49:22.390 に答える