我正在尝试将我的应用程序中每位员工的照片保存在他/她的个人资料旁边,然后每当有任何用户打开此员工资料时都会检索此图片,因此我制作了以下课程:
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中保存/检索员工形象的示例代码吗?
谢谢你或你的时间
答案 0 :(得分:0)
以下是您在HTML中显示图片的方式:
<img src="the-url-of-the-image" />
当浏览器在HTML页面中看到此<img>
标记时,它会向标记中引用的URL发送另一个HTTP请求,并且服务器会发回包含图像字节的响应,以及内容 - 类型标题告诉浏览器它是什么类型的图像(image/jpg
,image/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 Upload。 Here是示例代码(而不是保存到文件系统,您可以将其保存在数据库中)。您可以在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}"/>"/>