Главная Библиотека Шаблоны и примерыЗадача 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 |
| |
|
|