Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть вторая

Николай Норкин

г. Киров

notesnet@notesnet.ru

<<< Предыдущая чвсть | Продолжение >>>

Основной запрос к сервлету будет post-запрос /servlets/UploadProcess?ключ_профиля_настройки

Для обновления списка настройки будет использоваться get-запрос /servlets/UploadProcess

Основная процедура обработки post-запросов

protected void doPost( javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

lotus.domino.Session session = null;

javax.servlet.http.HttpServletRequest _request = request;

javax.servlet.http.HttpServletResponse _response = response;

java.io.PrintWriter out = null;

try {

String remote_address = _request.getRemoteAddr(); // ip-адрес пользователя потребуется при обработке Google reCaptcha

String user = _request.getRemoteUser(); // пользователь будет записан как автор (создатель) документа

String parameter = _request.getQueryString(); // переданный ключ профиля настроек

_response.setContentType("text/json;charset=Windows-1251");

NotesThread.sinitThread();

session = NotesFactory.createSession();

out = _response.getWriter();

// Передать входной поток в класс обработки

ru.medkirov.servlets.uploadprocess.DocumentContext documentContext = new ru.medkirov.servlets.uploadprocess.DocumentContext(session, _request);

// дальнейшая обработка результатов

.....

}

catch (Exception e) {}

finally {

try {

if (session != null) session.recycle();

NotesThread.stermThread();

} catch (Exception e) {}

}

}

Класс ru.medkirov.servlets.uploadprocess.DocumentContext и обработка входного потока

При инициализации класса входной поток распарсивается и складывается в объекты ru.medkirov.servlets.uploadprocess.Item

public DocumentContext(lotus.domino.Session session, javax.servlet.http.HttpServletRequest request) {

this.session = session;

this.parse(request);

}

protected void parse(javax.servlet.http.HttpServletRequest request) {

try {

javax.servlet.ServletInputStream inputStream = request.getInputStream();

// java.util.Enumeration<String> headerNames = request.getHeaderNames(); // получение заголовков содержимого post-запроса

String header = request.getHeader("Content-Type"); // получение заголовка Content-Type

String[] headers = header.split(";");

if (!headers[0].equalsIgnoreCase("multipart/form-data")) return; // обрабатывается только запрос с содержимым multipart/form-data

headers = headers[1].trim().split("=");

if (!headers[0].equalsIgnoreCase("boundary")) return;

header = headers[1].trim(); // получение значения boundary - разделителя частей запроса

byte[] boundary = header.getBytes();

java.nio.charset.Charset encoding = java.nio.charset.Charset.defaultCharset();

com.google.common.net.MediaType contentType = com.google.common.net.MediaType.parse("multipart/form-data");

// обработка потока (дробление на части) и передача в метод addItem

org.apache.commons.fileupload.MultipartStream multipartStream =

                new org.apache.commons.fileupload.MultipartStream(inputStream, boundary);

boolean nextPart = multipartStream.skipPreamble();

while (nextPart) {

header = multipartStream.readHeaders(); // выделить заголовок

            this.addItem(header, multipartStream); // выделенную часть - в обработку

            nextPart = multipartStream.readBoundary(); // к следующей части

        }

} catch(Exception e) {

    e.printStackTrace();

}

}

protected void addItem(String header, org.apache.commons.fileupload.MultipartStream multipartStream) {

try {

java.io.ByteArrayOutputStream stream = new java.io.ByteArrayOutputStream();

java.io.PrintStream body = new java.io.PrintStream(stream);

multipartStream.readBodyData(body);

// Хранение и дальнейшая обработка - в объекте класса ru.medkirov.servlets.uploadprocess.Item

ru.medkirov.servlets.uploadprocess.Item item = new ru.medkirov.servlets.uploadprocess.Item( header, stream);

String key = item.getKey();

if (key.equals("")) return;

// все item сохраняются в java.util.Map fileItems

if (this.fileItems == null) this.fileItems = new java.util.HashMap();

this.fileItems.put(key, item); // а вот эту строчку в окончательном варианте придётся пересмотреть для работы с многозначными полями

if (item.isAttachment()) this.hasAttachment = true;

}

catch (Exception e) {

    e.printStackTrace();

}

}

Функции класса ru.medkirov.servlets.uploadprocess.DocumentContext

Функция hasAttachment() возвращает результат, содержатся ли в запросе файлы

public boolean hasAttachment() {

return this.hasAttachment;

}

Функция getKeys() возвращает список имён переданных в запросе значений

public Object[] getKeys() {

try {

return this.fileItems.keySet().toArray();

}

catch (Exception e) {}

return null;

}

Функция getFileItem(String key) возвращает объект по имени

public ru.medkirov.servlets.uploadprocess.Item getFileItem(String key) {

try {

return (ru.medkirov.servlets.uploadprocess.Item) this.fileItems.get(key);

}

catch (Exception e) {}

return null;

}

Остальные функции осуществляют навигацию по объектам

public ru.medkirov.servlets.uploadprocess.Item getFirst() {

try {

if (this.fileItems == null) return null;

this.iterator = this.fileItems.entrySet().iterator();

java.util.Map.Entry entry = (java.util.Map.Entry) this.iterator.next();

return (ru.medkirov.servlets.uploadprocess.Item) entry.getValue();

}

catch (Exception e) {}

return null;

}

public boolean hasNext() {

if (this.iterator == null) return false;

return this.iterator.hasNext();

}

public ru.medkirov.servlets.uploadprocess.Item getNext() {

try {

if (this.iterator == null) return null;

if (!this.iterator.hasNext()) return null;

java.util.Map.Entry entry = (java.util.Map.Entry) this.iterator.next();

return (ru.medkirov.servlets.uploadprocess.Item) entry.getValue();

}

catch (Exception e) {}

return null;

}

public ru.medkirov.servlets.uploadprocess.Item first() {

return this.getFirst();

}

public ru.medkirov.servlets.uploadprocess.Item next() {

return this.getNext();

}

Ссылки

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть первая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть третья

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть четвёртая

Задача Domino HTTP. Обработка загружаемых файлов сервлетом UploadProcess. Часть пятая

Код сервлета

Apache Commons FileUpload
 
  Опубликовано — 02/10/2021 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU