Это может звучать полностью глупым, но является случаем реальной жизни :(
Я могу отобразить 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 );
%>
Я близко к решению?
Это работало бы клиенту, как будто он нажал действительно в сервере для реального файла?
Заранее спасибо.
до точки, просто напишите тот же код в JSP, так как вы будете делать в классе сервлета . Вы можете практически Copypaste это. Убедитесь, что вы не WRITINIG любой текст шаблона в поток, это включает в себя Linebreaks и пробелы вне сценария. В противном случае он будет написан в двоичный файл, а также повредить его.
Если у вас есть несколько блоков скриппта, то вам нужно их организовать, чтобы не было свободного разряда между окончанием %>
скрипплета и запуска <%
следующего сценария Отказ Таким образом, например
<%@page import="java.io.InputStream" %><%
//...
%>
вместо
<%@page import="java.io.InputStream" %>
<%
//...
%>
Как насчет самого 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 приложения/октета-потока используется для указания двоичного файла.
Модели терминалов 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... Надеюсь, это поможет.
Пожалуйста, пожалуйста, пожалуйста, не делайте этого.
Вы делаете медведь для ваших пользователей.
HTTP удивительно богат с точки зрения того, что он может сделать с файлами. Кэширование, кусочка, случайное доступу и т. Д.
Взгляните на что-то вроде Fileservlet , и молот, чтобы соответствовать. Да, это сервлет, а не JSP, но это то, что вы хотите сделать, чтобы быть хорошим HTTP-гражданином.
Некоторые контейнеры имеют другие варианты, которые вы можете использовать, вы можете взломать Tomcats Default Seadervlet и т. Д.