保存 - 检索图像数据库休眠

时间:2013-08-18 13:26:52

标签: spring hibernate jsp

我正在尝试将我的应用程序中每位员工的照片保存在他/她的个人资料旁边,然后每当有任何用户打开此员工资料时都会检索此图片,因此我制作了以下课程:

public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="EMPLOYEE_ID")
private Long id;
.
//many other fields goes here...
.
@OneToOne(cascade={CascadeType.ALL})
@PrimaryKeyJoinColumn
private EmployeePicture employeepicture;    
}

public class EmployeePicture {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="EMPPIC_ID")
private Long id;

@Column(name="EMPLOYEE_PIC")
@Lob
private Blob employeePicture;
}

然后我创建了以下DAO类,当然除了我已经拥有的EmployeeDAO类...

@Repository
public class EmployeePictureDAO implements IEmployeePictureDAO {

@Autowired
SessionFactory sessionfactory;

public void saveEmployeePicture(EmployeePicture employeepicture) {
sessionfactory.getCurrentSession().save(employeepicture);
}
public void updateEmployeePicture(EmployeePicture employeepicture) {
sessionfactory.getCurrentSession().update(employeepicture);
}
public void deleteEmployeePicture(EmployeePicture employeepicture) {
sessionfactory.getCurrentSession().delete(employeepicture);
}
public EmployeePicture getEmployeePictureByPK(Long id) {        
return (EmployeePicture)sessionfactory.getCurrentSession().get(EmployeePicture.class,id);
}
}

从服务层类开始,我只有EmployeeService类,我认为它应该同时调用EmployeeDAO和EmployeePictureDAO方法,因为数据和图片将同时保存/更新和删除。但不幸的是,我无法弄清楚/找到(在搜索网页后)如何从/向JSP保存/检索图像。那么有人可以帮我提一下如何在Service / Controller类和JSP中保存/检索员工形象的示例代码吗?

谢谢你或你的时间

3 个答案:

答案 0 :(得分:0)

以下是您在HTML中显示图片的方式:

<img src="the-url-of-the-image" />

当浏览器在HTML页面中看到此<img>标记时,它会向标记中引用的URL发送另一个HTTP请求,并且服务器会发回包含图像字节的响应,以及内容 - 类型标题告诉浏览器它是什么类型的图像(image/jpgimage/png等。)

当图像是静态文件时,您通常无需执行任何操作,因为Web服务器会为您完成所有操作:它从文件扩展名中推断出内容类型,读取文件并在其中发送数据。响应。

在你的情况下,由于图像在数据库中,你必须自己做,通过编写一个从数据库中获取图像的servlet或Spring MVC控制器,并将其发送回HTTP响应,使用适当的conent-type标头集。

因此,为员工个人资料页面生成的视图将包含类似

的内容
<img src="<c:url value='/employeePicture">
              <c:param name='employeeId' value='${employee.id}'/>
          </c:url>" />

您将有一个映射到/employeePicture的控制器,它将从数据库加载员工图片,设置响应内容类型标头,并发回图像的字节。

答案 1 :(得分:0)

我们有一个不同的策略 - 我们只存储图像路径,但这种方法可能对您有所帮助:

@ResponseBody
@RequestMapping(value = "/images/{imageId}", method = RequestMethod.GET, produces="image/*")
public void getImage(@PathVariable Long imageId, HttpServletResponse response) throws IOException {
    response.setContentType("image/jpeg");
    ArticleImage requestedImage = articleImageService.findOne(imageId);
    InputStream in = servletContext.getResourceAsStream(requestedImage.getPath()); // Make "in" object creation from Blob here (instead of loading resource as stream)
    if (in != null) {
        IOUtils.copy(in, response.getOutputStream());
    }else {
        logger.error("Missing requested image " + requestedImage);
    }
}

在视图中我们有:

<img src="${home}/images/${article.id}" />

所以浏览器使用url“/ images / {id}”发出GET请求并渲染获得的图像。

希望有所帮助

答案 2 :(得分:0)

要上传图片,您可以使用Commons File UploadHere是示例代码(而不是保存到文件系统,您可以将其保存在数据库中)。您可以在Web上找到大量用于文件上传的示例。

为了检索,我建议使用专用于显示图像的servlet。这是一个例子

@WebServlet("/image/*")
public class ImageServlet extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;

private static final int DEFAULT_BUFFER_SIZE = 10240;

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // Get requested image by path info.
    String requestedImage = request.getParameter("value");
    // Check if file name is actually supplied to the request URI.
    if (requestedImage == null) {
        // Do your thing if the image is not supplied to the request URI.
        // Throw an exception, or send 404, or show default/warning image,
        // or just ignore it.
        response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
        return;
    }

    File image = //retrieve your image from the DB with the id(variable requestedImage);

    // Check if file actually exists.
    if (!image.exists()) {
        // Do your thing if the file appears to be non-existing.
        // Throw an exception, or send 404, or show default/warning image,
        // or just ignore it.
        image = new File(imageDir, Constants.DEFAULT_IMAGE);
        if (!image.exists()){
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    }
    RandomAccessFile f = new RandomAccessFile(image, "rw");
    byte[] b = new byte[(int) f.length()];
    f.read(b);
    f.close();
    response.reset();
    response.setBufferSize(DEFAULT_BUFFER_SIZE);
    response.setContentType("image/png");
    response.getOutputStream().write(b);
}

}

现在检索jsp中的图像

<img src="<c:url value="/image/?value=${id}"/>"/>