Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/128: Рейтинг темы: голосов - 128, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849

Аттачи: получение бинарника

02.02.2012, 12:34. Показов 23565. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только без выгрузки файла в какую либо директорию и получения банарника через stream.
Есть ли такая возможность?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2012, 12:34
Ответы с готовыми решениями:

Аттачи: получение из RtItem
Доброго времени суток всем. ПОдскажите пожалуйста как получить аттачмент из RT поля на Java? Надо сделать нечто подобное ...

Аттачи в Web
Прошу поделиться опытом и наработками в отображении аттачей в вебе. Кто как делает? Чтобы было красиво и удобно...

аттачи в письме
Привет всем! есть письмо в почтовой бд по кнопке из вида срабатывает печать писем в котором лежит .doc файлы нужно определять...

17
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 2,219
02.02.2012, 12:44
Если не через stream, то как (в каком виде) Вы хотели бы получить файл?
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
02.02.2012, 12:46
Цитата Сообщение от nvy
Если не через stream, то как (в каком виде) Вы хотели бы получить файл?
В виде бинарника, который потом уйдет в другую систему через urlConnection)
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
02.02.2012, 15:45
не понятны "претензии" к стриму
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
02.02.2012, 16:40
ну вот <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">как то так)</div></div><div class="sp-body"><div class="sp-content"><!--shcode--><pre><code class=java>public class JavaAgent extends AgentBase {

public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();

//Получаем документ
Database db = session.getDatabase("server", "DB.NSF");
Agent agent = agentContext.getCurrentAgent();
Document doc = db.getDocumentByID(agent.getParameterDoc ID());
Document doc = db.getDocumentByID("B7DA");

String URL = "<тут путь с логином и паролем>";

//Получаем имена аттачай
String ATTACH_NAME = "";
String ATTACH_BIN = "";
Vector items = doc.getItems();
for (int j=0; j<items.size(); j++) {
Item item = (Item)items.elementAt(j);
switch (item.getType()) {
case Item.ATTACHMENT:
EmbeddedObject obj = doc.getAttachment(item.getValueString()) ;
ATTACH_NAME = ATTACH_NAME + "Attachment: " + obj.getName() + "\n";
ATTACH_BIN = ATTACH_BIN + Как сюда засунуть бинрник аттача????
break;
}
}

//Формируем текст запроса
String CONTENT = "content=id: ticket/new";
CONTENT = CONTENT + "\nQueue: " + "server";
CONTENT = CONTENT + "\nSubject: " + "SUBJ";
CONTENT = CONTENT + "\nRequestor: " + "FROM MAIL";
CONTENT = CONTENT + "\nText: " + "TEST";
CONTENT = CONTENT + "\n" + ATTACH_NAME;
CONTENT = CONTENT + "\n" + ATTACH_BIN;

//Отправляем запрос в RT
String REQUEST = doPost(URL, CONTENT);

//Парсим ответ сервера
...
}
catch(Exception e) {
e.printStackTrace();
}
}

public String doPost(String urlString, String query) {
String line;
URLConnection urlConnection;
try {
String charset = "UTF-8";
URL url = new URL(urlString);
urlConnection = url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("Accept-Charset", charset);
urlConnection.setRequestProperty("Conten t-Type", "application/x-www-form-urlencoded;charset=" + charset);
OutputStream output = null;
output = urlConnection.getOutputStream();
output.write(query.getBytes(charset));
output.close();
StringBuffer response = new StringBuffer();
BufferedReader input = new BufferedReader(new InputStreamReader(urlConnection.getInput Stream()));
while ((line = input.readLine()) != null) { response.append(line + "\n");}
input.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}[/CODE]
Добавлено:


Цитата Сообщение от lmike
не понятны "претензии" к стриму
ну на LS нужно предварительно выгрузить файл из документа в какую либо директорию, чтобы потом взять бинарник через stream.

может на Java не так, не силен)
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
02.02.2012, 20:31
ну на LS нужно предварительно выгрузить файл из документа в какую либо директорию, чтобы потом взять бинарник через stream.
ващето - нет...
берём ДХЛ - гоним его в SAX, дергаем тег filedata, декодим его через base64 - вот они бинарные данные
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
02.02.2012, 20:46
в джаве аналогично, но там с нотусёвым стримом засада - он какбэ нахненужен, но без него никак не экспортнуть (тока в стринг)
потому мона сразу в стринг и дёрнуть filedata
дергалки файлов я постил "на интертрасте" http://web2.inttrust.ru/site/itforum.nsf/4...#33;OpenDocumen
там есть дергалки через ДОМ - но это накладные расходы по памяти, кот. жвм выделено мало, в нотусне, и ежели не поменять нотес.ини - память могет скончаться
а для ДОМ и ЛС http://web2.inttrust.ru/site/itforum.nsf/a...2A?OpenDocument
тока тег другой взять, но в base64 - будет е..ля под ЛС (если данных много)
тамже есть конвертация base64 (для ЛС) http://web2.inttrust.ru/site/itforum.nsf/a...0A?OpenDocument
в джаве оно штатно
0
1 / 1 / 0
Регистрация: 07.12.2009
Сообщений: 1,197
03.02.2012, 02:04
А если читать с помощью Java (там же ж есть Stream в Java Classes), брать string из filedata и использовать "родной" явовский кодировщик в base64? Не понятно, зачем тут LS?
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
03.02.2012, 13:46
Не понятно, зачем тут LS?
ответ -


может на Java не так, не силен)
и мой -


накладные расходы по памяти, кот. жвм выделено мало, в нотусне, и ежели не поменять нотес.ини - память могет скончаться
0
0 / 0 / 0
Регистрация: 04.11.2007
Сообщений: 3,019
03.02.2012, 15:16
еще круче
1. гоним в стим
2. вырезаем всё кроме аттача
3. импортим стим в базу в виде простого документа с ататчем
4. урл на атач буде типа http://base.nsf/filename/$FILE/filename
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
03.02.2012, 15:26
Цитата Сообщение от kizarek

LotusScript
1
2
3
    String ATTACH_BIN = "";
ATTACH_BIN  = ATTACH_BIN + Как сюда засунуть бинрник аттача????
}
Позволю себе провести небольшой ликбез:
бинарник - это byte[]. Преобразование его в строку возможно кучей способов. Не существует единственного правильного (стандартного, общепринятого - как угодно ) способа преобразовать массив байт в строку.
Поэтому вам для начала надо определиться со способом кодировки...
Судя по всему - вы собираетесь гнать его в x-www-form-urlencoded, что не совсем разумно. http://www.ietf.org/rfc/rfc1867.txt: The encoding type application/x-www-form-urlencoded is inefficient for sending large quantities of binary data or text containing non-ASCII characters. Thus, a new media type, multipart/form-data, is proposed as a way of efficiently sending the values associated with a filled-out form from client to server.

По сути вопроса:
Для получения содержимого файла проще всего воспользоваться EmbeddedObject.getInputStream().
Строку из файла делать не надо - это мучительная и затратная по памяти операция, тем более что в итоге вы будете его писать его в OutputStream.
Читайте данные из EmbeddedObject.getInputStream(), конвертируйте в нужный формат ( url-encoded в вашем случае ) и пишите в сonnection.getOutputStream(). В результате - затраты по памяти будут околонулевые.

P.S. eo.getInputStream() требует доступа на запись в ФС, т.к. физически происходит выгрузка аттача в темповую папку. Аттач автоматически убивается при выполнении eo.recycle(). Подробности - в хелпе.
Если есть серьезные причины избежать записи на диск - можно потанцевать вокруг dxl или посмотреть на Document.ConvertToMIME ( since 8.5.1 )
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
06.02.2012, 10:03
turumbay
По поводу "x-www-form-urlencoded",
не моя хотелка, нужно аттач передать в другую систему, как понимаю другого не ест.


По сути вопроса:
Для получения содержимого файла проще всего воспользоваться EmbeddedObject.getInputStream().
Строку из файла делать не надо - это мучительная и затратная по памяти операция, тем более что в итоге вы будете его писать его в OutputStream.
Читайте данные из EmbeddedObject.getInputStream(), конвертируйте в нужный формат ( url-encoded в вашем случае ) и пишите в сonnection.getOutputStream(). В результате - затраты по памяти будут околонулевые.
Слаб я в Java)

<!--shcode--><pre><code class=java>Vector items = doc.getItems();
for (int j = 0; j < items.size(); j++) {
Item item = (Item)items.elementAt(j);
switch (item.getType()) {
case Item.ATTACHMENT:
EmbeddedObject obj = doc.getAttachment(item.getValueString()) ;
obj.getInputStream() // что дальше с этим делать?
break;
}
}
// Отправляем запрос
OutputStream output = null;
output = urlConnection.getOutputStream();
output.write(query.getBytes(charset));
output.close();[/CODE]
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
06.02.2012, 13:03
Имея inputStream с контентом файла - просто пишем его в oututStream открытого соединения. Как-то так:

Code
1
2
3
4
5
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1){
output.write(buffer, 0, bytesRead);
}
в вашем случае - нужно еще применить какое-то преобразование к контенту файла, чтобы соответствовать заявленному формату( urlencoded ). Как перегнать произвольный ( не текстовый ) файл в %% - я не очень в курсе. Предположу, что для заданного byte[] нужно собрать строку:

Code
1
2
3
 String bullshit = new String( buffer, "UTF-8" ); // собираем строку. Для бинарных файлов получится какая-то фигня.
String encoded = URLEncoder.encode( bullshit, "UTF-8" ); // енкодим в url-encoded
byte[] bytes = encoded.getBytes(); // и вот этот byte[] пишем в открытый поток
Однако, есть подозрение, что это не совсем то, что вам нужно. Таки подозреваю, что от вас хотят какой-то более нормальный вариант передачи файла: multipart form-data, или хотя бы base64 в теле поста...
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.02.2012, 13:18
obj.getInputStream() - что дальше с этим делать?
оно уже типа инпут стрим, т.е. его можно подавать на вход "любоой" ф-ции кот. принимает такой базовый класс или юзазать read...
существует 1000+ способов (это вам не LS) как исполнять передачу
вот небольшие примерчики http://stackoverflow.com/questions/43157/e...an-outputstream

Добавлено: в "старых" джавах, где присутствует sun.misc.BASE64...
можно

Code
1
2
    byte encoded[] = new sun.misc.BASE64Encoder().encodeBuffer(in);
out.write(encoded);
http://www.docjar.com/docs/api/sun/misc/Ch...ncode%28byte%29

Добавлено: стоит отметить, что классы misc не рекомендуется использовать
0
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
06.02.2012, 13:20
и "тогда" можно подключать аппачевский енкодер либо на своё усмотрение
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
06.02.2012, 15:47
Цитата Сообщение от turumbay
Имея inputStream с контентом файла - просто пишем его в oututStream открытого соединения. Как-то так:


Code
1
2
3
4
5
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1){
output.write(buffer, 0, bytesRead);
}
И как его заиметь для аттача лотусового?)
0
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 615
06.02.2012, 16:43
Цитата Сообщение от kizarek
И как его заиметь для аттача лотусового?)
EmbeddedObject eo = doc.getAttachment(...)
InputStream input = eo.getInputStream()
0
0 / 0 / 0
Регистрация: 16.07.2007
Сообщений: 849
07.02.2012, 09:57
Цитата Сообщение от turumbay
Поэтому вам для начала надо определиться со способом кодировки...
Судя по всему - вы собираетесь гнать его в x-www-form-urlencoded, что не совсем разумно. http://www.ietf.org/rfc/rfc1867.txt: The encoding type application/x-www-form-urlencoded is inefficient for sending large quantities of binary data or text containing non-ASCII characters. Thus, a new media type, multipart/form-data, is proposed as a way of efficiently sending the values associated with a filled-out form from client to server.
Вы правы.
Придется заморочится с "multipart/form-data".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2012, 09:57
Помогаю со студенческими работами здесь

опять про аттачи :(
Есть необходимость вставлять аттачи (вордовские файлы) в документы. что-то вроде тех.библиотеки. типа 1 аттач - один документ. аттачей...

не отображаются аттачи в письме
Привет всем! в почтовой бд есть письма у которые аттачи не отображаются, был код на сохранении письма - уже убрали - он вероятно...

Аттачи: программно конвертить
Привет всем! Сталкивался ли кто нибудь с задачкой: уменьшить размер базы путем пережатия картинок (bmp-&gt;jpg и т д) через конверток,...

Аттачи: вытянуть информацию
Добрый день. Мне нужно будет обработать с помощью LS значения из аттачментов письма. Я обрабатывал *.doc и *.xls файлы. Сейчас...

Разделение RT на 2 отдельных: текст и аттачи
Камрады, доброе утро! Голова ещё не работает так хорошо, что бы усиленно думать (тем более отпуск скоро), но уже достаточно для того...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru