Как обслуживать файл с JSP? - PullRequest
8 голосов
/ 22 января 2010

Это может звучать совершенно глупо, но это случай из реальной жизни :(

Я могу отобразить таблицу HTML с «виртуальным» именем ссылки.

Примерно так:

Xyz description   <a href="docId=123">document.doc</a>

Xyz description  <a href="docId=456">documentB.doc</a>

Xyz description  <a href="docId=798">documentC.doc</a>

Этот идентификатор документа представляет идентификатор в базе данных (поскольку эти документы хранятся в большом двоичном объекте в виде байта [])

Во всяком случае. Я могу получить этот идентификатор, запросить базу данных и получить байт [] (и даже сохранить его в файле tmp)

То, что я не могу понять, как это сделать, это то, что когда пользователь щелкает ссылку (и после того, как я выполняю поиск в БД), «обслуживает» байт [] для пользователя.

Теперь самое худшее, и что заставляет меня задавать этот вопрос здесь, мне нужно сделать это только с JSP (без сервлета) и без сторонних библиотек (просто ... не спрашивайте меня, почему я ненавижу это тоже)

Итак. Как мне обслуживать в jsp двоичное содержимое байтового массива, хранящегося в файловой системе сервера

Мой первый гость:

<%
InputStream read // read the file form the fle system 
response.getOutputStream().write( theBytesReader );
%>

Я близок к решению?

Будет ли это работать для клиента, как если бы он действительно нажал на сервере для реального файла?

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 22 января 2010

Кстати, просто напишите тот же код в JSP, что и в классе сервлетов . Вы можете практически скопировать его. Только убедитесь, что вы не записываете любой текст шаблона в поток, включая разрывы строк и пробелы за пределами скриптлетов. В противном случае он также будет записан в двоичный файл и испортит его.

Если у вас есть несколько блоков сценариев, вам нужно расположить их так, чтобы между окончанием %> сценария и началом <% следующего сценария не было разрыва строки. Так, например,

<%@page import="java.io.InputStream" %><%
    //...
%>

вместо

<%@page import="java.io.InputStream" %>
<%
    //...
%>
2 голосов
/ 22 января 2010

Пожалуйста, пожалуйста, пожалуйста, не делайте этого.

Вы оказываете плохую услугу своим пользователям.

HTTP поразительно богат тем, что он может делать с файлами.Кэширование, чанкинг, произвольный доступ и т. Д.

Взгляните на что-то вроде FileServlet и подберите подходящее.Да, это сервлет, а не JSP, но это то, что вы хотите сделать, чтобы быть хорошим гражданином HTTP.

В некоторых контейнерах есть другие опции, которые вы можете использовать, вы можете взломать Tomcats DefaultServlet и т. Д.1011 *

2 голосов
/ 22 января 2010

Вам необходимо установить тип MIME в ответе HTTP, как показано ниже, в дополнение к предоставленному вами коду кода.

response.setContentType("application/octet-stream");

Обратите внимание, что тип MIME application / octet-stream используется для обозначения двоичного файла.

1 голос
/ 22 января 2010

Как то так ...

InputStream instr = null;
try {
    instr = new BufferedInputStream( new FileInputStream("file.txt") );
    for(int x=instr.read(); x!=-1; x=instr.read()){
        out.write(x);
    }
} finally {
    out.close();
    if( instr != null) instr.close();
}

Это понадобится вам как ответ на щелчок (либо при перезагрузке страницы, либо в другом файле jsp).

Есть лучшие решения для буферизации, которые вы можете сделать с записью, используя байтовые массивы, а не по одному ... Я оставлю это для вас.

Извините, что застряли в стране сценариев JSP ... Надеюсь, это поможет.

...