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

Тема в разделе "Lotus + Java + LS2J", создана пользователем Kizarek86, 3 фев 2012.

  1. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Только без выгрузки файла в какую либо директорию и получения банарника через stream.
    Есть ли такая возможность?
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Если не через stream, то как (в каком виде) Вы хотели бы получить файл?
     
  3. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    В виде бинарника, который потом уйдет в другую систему через urlConnection)
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    не понятны "претензии" к стриму
     
  5. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    ну вот <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.getParameterDocID());
    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("Content-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.getInputStream()));
    while ((line = input.readLine()) != null) { response.append(line + "\n");}
    input.close();
    return response.toString();
    } catch (Exception e) {
    e.printStackTrace();
    return null;
    }
    }

    }[/CODE]
    Добавлено:
    ну на LS нужно предварительно выгрузить файл из документа в какую либо директорию, чтобы потом взять бинарник через stream.

    может на Java не так, не силен)
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ващето - нет...
    берём ДХЛ - гоним его в SAX, дергаем тег filedata, декодим его через base64 - вот они бинарные данные
     
  7. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    в джаве аналогично, но там с нотусёвым стримом засада - он какбэ нахненужен, но без него никак не экспортнуть (тока в стринг)
    потому мона сразу в стринг и дёрнуть 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
    в джаве оно штатно
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    А если читать с помощью Java (там же ж есть Stream в Java Classes), брать string из filedata и использовать "родной" явовский кодировщик в base64? Не понятно, зачем тут LS?
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ответ -
    и мой -
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    еще круче :)
    1. гоним в стим
    2. вырезаем всё кроме аттача
    3. импортим стим в базу в виде простого документа с ататчем
    4. урл на атач буде типа http://base.nsf/filename/$FILE/filename
     
  11. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Позволю себе провести небольшой ликбез:
    бинарник - это 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 )
     
  12. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    turumbay
    По поводу "x-www-form-urlencoded",
    не моя хотелка, нужно аттач передать в другую систему, как понимаю другого не ест.
    Слаб я в 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]
     
  13. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    Имея inputStream с контентом файла - просто пишем его в oututStream открытого соединения. Как-то так:
    Код (Text):
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer)) != -1){
    output.write(buffer, 0, bytesRead);
    }
    в вашем случае - нужно еще применить какое-то преобразование к контенту файла, чтобы соответствовать заявленному формату( urlencoded ). Как перегнать произвольный ( не текстовый ) файл в %% - я не очень в курсе. Предположу, что для заданного byte[] нужно собрать строку:
    Код (Text):
     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 в теле поста...
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    оно уже типа инпут стрим, т.е. его можно подавать на вход "любоой" ф-ции кот. принимает такой базовый класс или юзазать read...
    существует 1000+ способов (это вам не LS) как исполнять передачу
    вот небольшие примерчики http://stackoverflow.com/questions/43157/e...an-outputstream

    Добавлено: в "старых" джавах, где присутствует sun.misc.BASE64...
    можно
    Код (Text):
        byte encoded[] = new sun.misc.BASE64Encoder().encodeBuffer(in);
    out.write(encoded);
    http://www.docjar.com/docs/api/sun/misc/Ch...ncode%28byte%29

    Добавлено: стоит отметить, что классы misc не рекомендуется использовать
     
  15. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    и "тогда" можно подключать аппачевский енкодер либо на своё усмотрение
     
  16. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
     
  17. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    EmbeddedObject eo = doc.getAttachment(...)
    InputStream input = eo.getInputStream()
     
  18. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Вы правы.
    Придется заморочится с "multipart/form-data".
     
Загрузка...
Похожие Темы - Аттачи получение бинарника
  1. Gor
    Ответов:
    3
    Просмотров:
    3.156
  2. Omh
    Ответов:
    32
    Просмотров:
    7.259
  3. deeeman
    Ответов:
    7
    Просмотров:
    3.382
  4. deeeman
    Ответов:
    9
    Просмотров:
    4.471
  5. deeeman
    Ответов:
    9
    Просмотров:
    3.433

Поделиться этой страницей