0

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

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 中保存/检索图像。那么有人可以通过给我一个关于如何在服务/控制器类和 JSP 中保存/检索员工图像的示例代码来帮助我吗?

谢谢你的时间

4

3 回答 3

0

以下是在 HTML 中显示图像的方法:

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

当浏览器<img>在 HTML 页面中看到这个标签时,它会向标签中引用的 URL 发送另一个 HTTP 请求,服务器会返回一个包含图像字节的响应,以及一个 content-type 头告诉浏览器什么样的图像它是(image/jpg,,image/png等)。

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

在您的情况下,由于图像在数据库中,因此您必须自己执行此操作,方法是编写一个 servlet 或 Spring MVC 控制器,该控制器从数据库中获取图像,并将其发送回 HTTP 响应,使用适当的内容类型标题集。

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

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

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

于 2013-08-18T13:36:29.417 回答
0

要上传图像,您可以使用Commons File Upload是一个示例代码(您可以将其保存在数据库中,而不是保存到文件系统中)。您可以在网上找到很多用于文件上传的示例。

对于检索,我建议使用专用于显示图像的 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}"/>"/>
于 2013-08-19T01:04:59.417 回答
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 请求并渲染获得的图像。

希望能帮助到你

于 2013-08-18T13:40:18.377 回答