Имеется БД, в которой лежат книги. Контент книги в базе записан в типе blob. Как можно отобразить контент средствами браузера? Перед тем как написать сюда гуглил, но в основном запросы не соответствуют моим требованиям (или плохо смотрел). Спасибо. n/ UPD. Как советуют @Roman C и @Sckoriy написал простенький сервлет:
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/pdf");
OutputStream out = response.getOutputStream();
try {
int id = Integer.valueOf(request.getParameter("id"));
SearchController sc = (SearchController) request.getSession(false).getAttribute("searchController");
byte[] pdf = sc.getPdf(id);
response.setContentLength(pdf.length);
out.write(pdf);
} catch(Exception ex) {
ex.printStackTrace();
} finally {
out.close();
}
}
Объект searchController
хранит в себе текущий список книг — объектов типа book
. Метод getPdf
возвращает массив байтов нужной книги (id), который я безуспешно пытаюсь отобразить в <iframe src="/Reader?id=1"></iframe>
— получаю свой заслуженный 404
.
Допустим,что есть бд с такой таблицей :
Как один с вариантов,который позволяет вывести на страницу Blob вот :
1.Создаем html страницу
Куча тегов..//
<iframe src = "http://172.16.108.183:8080/PracticeV0/IFrame?id=4"
height = "500" weight = "500"></iframe>
Тег iframe создает плавающий фрейм - то,что вам надо.Он будет делать запрос на сервлет,который будет записывать в исходящий поток файлы.(Но,об этом чуть позже)
2.Для того,чтобы убрать по максиму бизнес-логику от сервлета нужно создать класс Модель, в которой будут производится "вычисления".(Шаблон MVC)
public class ModelFiles {
private Connection connect;
private PreparedStatement prepare;
private Statement stat;
private ResultSet result;
private Blob blob;
public ModelFiles(Connection connect){
this.connect = connect;
}
public Blob readPDF(int id) {
try {
stat = connect.createStatement();
result = stat.executeQuery("Select PDF from files where id = " + id + ";");
result.next();
blob = result.getBlob("PDF");
result.close();
}catch(SQLException ex) {
ex.printStackTrace();
}
return blob;
}
Теперь перейдем к контроллеру - сервлету . package Controllers;
public class toIfraime extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//Создаем модель и передаем ей подключение(У меня подключение
//хранится в атрибутах контекста приложения)Добавляю я его туда при запуске
//приложения - Слушателям сервлетов , привет!
ModelFiles model = new
ModelFiles((Connection)getServletContext().getAttribute("Connection");
//Дальше,получаем Blob от модели
//В параметр передаем id файла
Blob blob = model.readPDF(3);
//Теперь можно и заголовки подготовить
response.setContentLength(blot.getSize());//эту строчку нужно поместить в try catch ибо метод getSize может выбросить исключение SQLException
response.setContentType("application/pdf");
//Теперь начинаем само чтение и записывание Blob
InputStream is = null;
BufferedInputStream buff = null;
OutputStream out = null;
BufferedOutputStream buffOut = null;
try{
is = blob.getBinaryStream();//Создаем простой входящий поток байтов.
buff = new BufferedInputStream(is);//Создаeм буфферизированный входящий поток
//байтов
out = response.getOutputStream();//Создаем просто исходящий поток байтов
buffOut = new BufferedOutputStream(out);//Буфферизируем исходящий поток
int bit = 0 ; //будем читать байтами
while((bit = buff.read()) != -1){//Пока не закончиться входящий
//поток,записывай байт в исходящий
buffOut.write(bit);//В response записываем байт
}
catch(SQLException ex){
ex.printStackTrace();
}finally{
if(buff != null){
buff.close();
}
if(buffOut != null){
buffOut.close();
}
Вот web.xml
<servlet>
<servlet-name>FrameFile</servlet-name>
<servlet-class>Controllers.toIfraime</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrameFile</servlet-name>
<url-pattern>/LoadPDF</url-pattern>
<servlet-mapping>
Вот результат :
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я разрабатываю приложение под android, и уже в течении долгого времени не могу решить одну проблему, а именно:
Вот если зайти на саму карту гугл и ввести в поиск магазины, то будет примерно такой результат