Как служить файлу с JSP?

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

Я могу отобразить 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 );
%>

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

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

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

8
задан Rachel 22 January 2010 в 05:14
поделиться

4 ответа

до точки, просто напишите тот же код в JSP, так как вы будете делать в классе сервлета . Вы можете практически Copypaste это. Убедитесь, что вы не WRITINIG любой текст шаблона в поток, это включает в себя Linebreaks и пробелы вне сценария. В противном случае он будет написан в двоичный файл, а также повредить его.

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

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

вместо

<%@page import="java.io.InputStream" %>
<%
    //...
%>
5
ответ дан 5 December 2019 в 17:37
поделиться

Как насчет самого C # ?

например

class MySimplePDLData {
  // format: name (or blank if padding), bit length, value (or blank if data),
  // name of presence flag field (or blank if no presence flag), C# type
  // one packet type per string, fields separated by pipes (|)
  string[] pdl = {

// MY-SIMPLE-PDL-START

  ",8,0xf8,|version,8,,Int32|type,8,,Int32|id1,64,,Int64",
  ...

// MY-SIMPLE-PDL-END

  };
}

Если данные уже находятся в памяти, вам не нужно выполнять ввод-вывод для формата файла. Отсюда можно либо динамически интерпретировать пакеты, либо генерировать необходимый исходный код C # для распознавания/упаковки/распаковки пакетов, снова используя сам C #.

-121--3978087-

Что-то подобное...

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... Надеюсь, это поможет.

-121--3665354-

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

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

Следует отметить, что тип MIME приложения/октета-потока используется для указания двоичного файла.

2
ответ дан 5 December 2019 в 17:37
поделиться

Модели терминалов Dec VT высшего уровня поддерживают графические команды ReGis и Sixel . Если эмуляция xterm достаточно хороша, может быть, так и было сделано?

-121--2152747-

Как насчет самого C # ?

eg

class MySimplePDLData {
  // format: name (or blank if padding), bit length, value (or blank if data),
  // name of presence flag field (or blank if no presence flag), C# type
  // one packet type per string, fields separated by pipes (|)
  string[] pdl = {

// MY-SIMPLE-PDL-START

  ",8,0xf8,|version,8,,Int32|type,8,,Int32|id1,64,,Int64",
  ...

// MY-SIMPLE-PDL-END

  };
}

Если данные уже находятся в памяти, не требуется выполнять ввод-вывод для формата файла. Отсюда можно либо динамически интерпретировать пакеты, либо генерировать необходимый исходный код C # для распознавания/упаковки/распаковки пакетов, снова используя сам C #.

-121--3978087-

Что-то подобное...

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... Надеюсь, это поможет.

1
ответ дан 5 December 2019 в 17:37
поделиться

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

Вы делаете медведь для ваших пользователей.

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

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

Некоторые контейнеры имеют другие варианты, которые вы можете использовать, вы можете взломать Tomcats Default Seadervlet и т. Д.

2
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: