Hiển thị ảnh từ database với Java Servlet
1. Database
** ORACLE **
create table PERSON
(
ID NUMBER(19) not null,
NAME VARCHAR2(50) not null,
IMAGE_DATA BLOB not null,
IMAGE_FILE_NAME VARCHAR2(30) not null
) ;
alter table PERSON
add constraint PERSON_PK primary key (ID);
** SQL SERVER **
create table PERSON
(
ID NUMERIC(19,0) not null,
NAME VARCHAR(50) not null,
IMAGE_DATA IMAGE not null,
IMAGE_FILE_NAME VARCHAR(30) not null
) ;
alter table PERSON
add constraint PERSON_PK primary key (ID);
** MYSQL **
create table PERSON
(
ID BIGINT not null,
NAME VARCHAR(50) not null,
IMAGE_DATA LONGBLOB not null,
IMAGE_FILE_NAME VARCHAR(30) not null
) ;
alter table PERSON
add constraint PERSON_PK primary key (ID);
2. Hiển thị ảnh từ Database với Servlet
Trong tài liệu này tôi hướng dẫn bạn cách hiển thị ảnh từ Database sử dụng Servlet. Thông thường dữ liệu ảnh được bạn lưu trữ trong Database tại một cột dữ liệu BLOB, bạn cần truy vấn lấy ra dữ liệu này dưới dạng byte[] và ghi vào response. Ở phần trên tôi đã giới thiệu một cơ sở dữ liệu nhỏ, nó được sử dụng cho bài học này.
Để hiển thị ảnh bạn cần một Servlet, và đường dẫn ảnh có thể giống như sau:
- http://localhost:8080/ServletExamples/image?id=2
- http://localhost:8080/ServletExamples/image?id=3
Hãy đảm bảo rằng bạn đã có kiến thức tốt về JDBC và Servlet. Nếu không bạn có thể tham khảo tại:JDBC:Servlet:
Project:
Person.java
package org.o7planning.servletexamples.model;
public class Person {
private Long id;
private String name;
private byte[] imageData;
private String imageFileName;
public Person() {
}
public Person(Long id, String name, String imageFileName, byte[] imageData) {
this.id = id;
this.name = name;
this.imageData = imageData;
this.imageFileName = imageFileName;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getImageData() {
return imageData;
}
public void setImageData(byte[] imageData) {
this.imageData = imageData;
}
public String getImageFileName() {
return imageFileName;
}
public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}
}
DisplayImageServlet.java
package org.o7planning.servletexamples;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.o7planning.servletexamples.model.Person;
import org.o7planning.tutorial.jdbc.ConnectionUtils;
// /image?id=123
@WebServlet(urlPatterns = { "/image" })
public class DisplayImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public DisplayImageServlet() {
super();
}
private Person getImageInTable(Connection conn, Long id) throws SQLException {
String sql = "Select p.Id,p.Name,p.Image_Data,p.Image_File_Name "//
+ " from Person p where p.id = ?";
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setLong(1, id);
ResultSet rs = pstm.executeQuery();
if (rs.next()) {
String name = rs.getString("Name");
byte[] imageData = rs.getBytes("Image_Data");
String imageFileName = rs.getString("Image_File_Name");
return new Person(id, name, imageFileName, imageData);
}
return null;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection conn = null;
try {
// Lấy ra kết nối tới Database.
// (Xem thêm tài liệu JDBC).
conn = ConnectionUtils.getMyConnection();
Long id = null;
try {
id = Long.parseLong(request.getParameter("id"));
} catch (Exception e) {
}
Person person = getImageInTable(conn, id);
if (person == null) {
// Không có dữ liệu ảnh, chuyển hướng tới một ảnh mặc định.
response.sendRedirect(request.getContextPath() + "/images/noimage.jpg");
return;
}
// trump.jpg, putin.png
String imageFileName = person.getImageFileName();
System.out.println("File Name: "+ imageFileName);
// image/jpg
// image/png
String contentType = this.getServletContext().getMimeType(imageFileName);
System.out.println("Content Type: "+ contentType);
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Length", String.valueOf(person.getImageData().length));
response.setHeader("Content-Disposition", "inline; filename=\"" + person.getImageFileName() + "\"");
// Ghi dữ liệu ảnh vào Response.
response.getOutputStream().write(person.getImageData());
} catch (Exception e) {
throw new ServletException(e);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Chạy ứng dụng:
Hướng dẫn lập trình Java Servlet/JSP
- Cài đặt Tomcat Server cho Eclipse
- Cài đặt Glassfish Web Server trên Windows
- Chạy ứng dụng Java web Maven trên Tomcat Maven Plugin
- Chạy ứng dụng Java Web Maven trên Jetty Maven Plugin
- Ví dụ luồng chạy ngầm trong ứng dụng Java Servlet
- Hướng dẫn lập trình Java Servlet cho người mới bắt đầu
- Hướng dẫn và ví dụ Java Servlet Filter
- Hướng dẫn lập trình Java JSP cho người mới bắt đầu
- Hướng dẫn sử dụng Java JSP Standard Tag Library (JSTL)
- Cài đặt Web Tools Platform cho Eclipse
- Tạo một ứng dụng Login đơn giản và bảo mật với Java Servlet Filter
- Tạo một ứng dụng Java Web đơn giản sử dụng Servlet, JSP và JDBC
- Upload và download file lưu trữ trên ổ cứng với Java Servlet
- Upload và Download file từ Database sử dụng Java Servlet
- Hiển thị ảnh từ database với Java Servlet
- Redirect 301 chuyển hướng vĩnh viễn trong Java Servlet
- Làm sao tự động chuyển hướng http thành https trong ứng dụng Java Web
- Hướng dẫn sử dụng Google reCAPTCHA trong ứng dụng Web Java
Show More