Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / как передать BLOB через XML? / 25 сообщений из 26, страница 1 из 2
12.05.2005, 13:36
    #33059730
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Добре всем!

Никак не могу врубиться где я пролетаю :(

Делаю следующее:
из БД вытаскиваю поле типа BLOB и пытаюсь его в виде XML передать по http (при помощи веб сервиса)

написал такой преобразователь blob-a в строку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   public  cl_hexdatastring(java.sql.Blob in)
  {
      StringBuffer sbuf;
       try  {
          sbuf =  new  StringBuffer();
          bis =  new  BufferedInputStream(in.getBinaryStream());
           int  ch = bis.read();
           while  (ch != - 1 ) 
          {
              // формируем строку из шестнадцатиричных цифр
              sbuf.append(Integer.toHexString(ch));
              ch = bis.read();
          }
          hexdatastring = sbuf.toString();
      }  catch  (Exception e) {
      }
  }
но вот в чем загвоздка: при формировании XML-данных странным образом теряются непечатные символы :( Т.е., если в БД лежит двоичный файл, содержащий пять символов, например "R2sw9", то преобразование проходит нормально и результат составляет 10 байт. А вот если загрузить реальную картинку, то на выходе преобразователя получаю меньше данных. чем должно быть.

Может кто сталкивался с такой проблемой, помогите советом, плиз.
...
Рейтинг: 0 / 0
12.05.2005, 13:50
    #33059776
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Возьми готовую библиотеку, которая в BASE64 кодирует, да и все, она вроде даже в стандартных api есть, вот только где и как называется не помню :)
...
Рейтинг: 0 / 0
12.05.2005, 13:56
    #33059795
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
А как вы их обратно собирать думаете?

вот только где и как называется не помню :)
Код: plaintext
1.
java.util.prefs.Base64
...
Рейтинг: 0 / 0
12.05.2005, 14:17
    #33059859
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
обратно собираю на PHP - парсю XML, читаю строку по 2 символа и перекодирую их в бинарник, который потом выплевываю пользователю в браузер...

Мне еще рекомендовали через MIME кодировать, только я не нашел библиотеку для работы с этим чудом, я в яве недавно совсем...
...
Рейтинг: 0 / 0
12.05.2005, 15:41
    #33060175
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 public   class  Main {

     public   static   void  main(String[] args) {
        System.out.println(Integer.toHexString( 0 ));
        System.out.println(Integer.toHexString( 255 ));
    }
}

Console:
 0 
ff

Я про это. Выб их выравнивали чтоли, а то Integer он не обязательно 2 символа преобразуется...
...
Рейтинг: 0 / 0
12.05.2005, 15:44
    #33060192
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Насчет MIME'а есть класс MimeUtility, но он из Java Mail - правда никто не мешает его себе скопировать чтобы весь mail.jar не таскать
...
Рейтинг: 0 / 0
12.05.2005, 16:41
    #33060375
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
funikovyuri
Я про это. Выб их выравнивали чтоли, а то Integer он не обязательно 2 символа преобразуется...

Входящая последовательность символов формируется методом bis.read(); это видно из примера в моем первом сообщении. А вот на счет "0" я не допер, спасибо за совет.
...
Рейтинг: 0 / 0
12.05.2005, 16:48
    #33060404
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
а интересно, если в возвращаемом значении в начале или в конце ноль будет, то как будет выглядеть результат?

Например, 0A или F0 так и будет отображено или останется только A и F соответственно?!
...
Рейтинг: 0 / 0
12.05.2005, 17:22
    #33060523
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
проблему разрулил - не печатаются лидирующие нули. в результате генных мутаций, получили такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   public  cl_hexdatastring(java.sql.Blob in)
  {
      StringBuffer sbuf;
       try  {
          sbuf =  new  StringBuffer();
          bis =  new  BufferedInputStream(in.getBinaryStream());
           int  ch = bis.read();
           while  (ch != - 1 ) 
          {
              // формируем строку из шестнадцатиричных цифр
               if  ( 1  == Integer.toHexString(ch).length())
              {
              sbuf.append("0");
              }
              sbuf.append(Integer.toHexString(ch));
              ch = bis.read();
          }
          hexdatastring = sbuf.toString();
      }  catch  (Exception e) {
      }
  }
...
Рейтинг: 0 / 0
12.05.2005, 17:35
    #33060575
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
чессо слово - используйте BASE64 или MIME. своих велосипедов и так хватает!
...
Рейтинг: 0 / 0
12.05.2005, 22:53
    #33061007
задорнов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Sehensucht! (потерял пароль)проблему разрулил - не печатаются лидирующие нули. в результате генных мутаций, получили такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   public  cl_hexdatastring(java.sql.Blob in)
  {
      StringBuffer sbuf;
       try  {
          sbuf =  new  StringBuffer();
          bis =  new  BufferedInputStream(in.getBinaryStream());
           int  ch = bis.read();
           while  (ch != - 1 ) 
          {
              // формируем строку из шестнадцатиричных цифр
               if  ( 1  == Integer.toHexString(ch).length())
              {
              sbuf.append("0");
              }
              sbuf.append(Integer.toHexString(ch));
              ch = bis.read();
          }
          hexdatastring = sbuf.toString();
      }  catch  (Exception e) {
      }
  }


записал. хорошая шутка. ждите на концертах.
...
Рейтинг: 0 / 0
14.05.2005, 09:38
    #33063880
Penkov Vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
 import  java.io.*;

 public   class  Base64 {

     static   final   char [] charTab =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
            .toCharArray();

     public   static  String encode( byte [] data) {
         return  encode(data,  0 , data.length,  null ).toString();
    }

    /** Encodes the part of the given byte array denoted by start and
    len to the Base64 format.  The encoded data is appended to the
    given StringBuffer. If no StringBuffer is given, a new one is
    created automatically. The StringBuffer is the return value of
    this method. */

     public   static  StringBuffer encode(
         byte [] data,
         int  start,
         int  len,
        StringBuffer buf) {

         if  (buf ==  null )
            buf =  new  StringBuffer(data.length *  3  /  2 );

         int  end = len -  3 ;
         int  i = start;
         int  n =  0 ;

         while  (i <= end) {
             int  d =
                (((( int ) data[i]) & 0x0ff) <<  16 )
                    | (((( int ) data[i +  1 ]) & 0x0ff) <<  8 )
                    | ((( int ) data[i +  2 ]) & 0x0ff);

            buf.append(charTab[(d >>  18 ) &  63 ]);
            buf.append(charTab[(d >>  12 ) &  63 ]);
            buf.append(charTab[(d >>  6 ) &  63 ]);
            buf.append(charTab[d &  63 ]);

            i +=  3 ;

             if  (n++ >=  14 ) {
                n =  0 ;
                buf.append("\r\n");
            }
        }

         if  (i == start + len -  2 ) {
             int  d =
                (((( int ) data[i]) & 0x0ff) <<  16 )
                    | (((( int ) data[i +  1 ]) &  255 ) <<  8 );

            buf.append(charTab[(d >>  18 ) &  63 ]);
            buf.append(charTab[(d >>  12 ) &  63 ]);
            buf.append(charTab[(d >>  6 ) &  63 ]);
            buf.append("=");
        }
         else   if  (i == start + len -  1 ) {
             int  d = ((( int ) data[i]) & 0x0ff) <<  16 ;

            buf.append(charTab[(d >>  18 ) &  63 ]);
            buf.append(charTab[(d >>  12 ) &  63 ]);
            buf.append("==");
        }

         return  buf;
    }

     static   int  decode( char  c) {

         if  (c >= 'A' && c <= 'Z')
             return  (( int ) c) -  65 ;
         else   if  (c >= 'a' && c <= 'z')
             return  (( int ) c) -  97  +  26 ;
         else   if  (c >= '0' && c <= '9')
             return  (( int ) c) -  48  +  26  +  26 ;
         else 
             switch  (c) {
                 case  '+' :
                     return   62 ;
                 case  '/' :
                     return   63 ;
                 case  '=' :
                     return   0 ;
                 default  :
                     throw   new  RuntimeException(
                        "unexpected code: " + c);
            }
    }

    /** Decodes the given Base64 encoded String to a new byte array.
    The byte array holding the decoded data is returned. */

     public   static   byte [] decode(String s) {

        ByteArrayOutputStream bos =  new  ByteArrayOutputStream();
         try  {

            decode(s, bos);

        }
         catch  (IOException e) {
             throw   new  RuntimeException();
        }
         return  bos.toByteArray();
    }

     public   static   void  decode(String s, OutputStream os)
         throws  IOException {
         int  i =  0 ;

         int  len = s.length();

         while  (true) {
             while  (i < len && s.charAt(i) <= ' ')
                i++;

             if  (i == len)
                 break ;

             int  tri =
                (decode(s.charAt(i)) <<  18 )
                    + (decode(s.charAt(i +  1 )) <<  12 )
                    + (decode(s.charAt(i +  2 )) <<  6 )
                    + (decode(s.charAt(i +  3 )));


            os.write((tri >>  16 ) &  255 );
             if  (s.charAt(i +  2 ) == '=')
                 break ;
            os.write((tri >>  8 ) &  255 );
             if  (s.charAt(i +  3 ) == '=')
                 break ;
            os.write(tri &  255 );

            i +=  4 ;
        }
    }
}

byte[] dataByteArray = Base64.decode(dataString);
...
Рейтинг: 0 / 0
14.05.2005, 09:39
    #33063890
как передать BLOB через XML?
есть стандартные средства.
...
Рейтинг: 0 / 0
14.05.2005, 10:00
    #33063949
Kudinov Anton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
sun.misc.Base64Decoder и sun.misc.Base64Encoder

но лучше воспользоваться Apache Commons Codecs
...
Рейтинг: 0 / 0
14.05.2005, 15:50
    #33065019
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
ВСЕМ Любителям Стандартов:

Объясните мне, плиз, в чем некорректно мое решение и почему надо использовать "стандартные средства". Только не надо флуда...
...
Рейтинг: 0 / 0
14.05.2005, 16:00
    #33065058
как передать BLOB через XML?
я не буду писать свой кодер/декодер бэйс64. мне жалко времени.
я возьму уже готовый. а будет время - посмотрю как это сделали
за меня другие.
...
Рейтинг: 0 / 0
14.05.2005, 16:02
    #33065062
Sehensucht! (потерял пароль)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
пожиратели времения не буду писать свой кодер/декодер бэйс64. мне жалко времени.
я возьму уже готовый. а будет время - посмотрю как это сделали
за меня другие. -1 за флуд
...
Рейтинг: 0 / 0
14.05.2005, 16:08
    #33065077
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
...
Рейтинг: 0 / 0
14.05.2005, 16:15
    #33065109
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
потому как если каждый будет рыться в своей песочнице мы так никуда и не придем
...
Рейтинг: 0 / 0
14.05.2005, 16:33
    #33065162
гы-гы-гы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
Sehensucht! (потерял пароль) пожиратели времения не буду писать свой кодер/декодер бэйс64. мне жалко времени.
я возьму уже готовый. а будет время - посмотрю как это сделали
за меня другие. -1 за флуд
мальчег. естлеп ты знал скока йа флудил на этом форуме, топ
низоштоп мне -1 не паставел. патомушта ат меня не убудед :)

PS спосиба кстате за аценку. но памоему ты не знаеш што токое флуд.
...
Рейтинг: 0 / 0
14.05.2005, 16:35
    #33065169
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
funikovyuriпотому как если каждый будет рыться в своей песочнице мы так никуда и не придем
/topic/81054&hl=java
ха ха, молодец :))
...
Рейтинг: 0 / 0
14.05.2005, 17:12
    #33065270
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
wessen

не понял! ты про что именно?
...
Рейтинг: 0 / 0
14.05.2005, 17:54
    #33065365
wessen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
funikovyuri wessen

не понял! ты про что именно?
Прикольный ты топик в форуме по С#.NET замутил :)
Это я от скуки по форумам лазил и нашел :)
...
Рейтинг: 0 / 0
14.05.2005, 17:57
    #33065371
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
А! Это я перед переходом на java выдал :) С тех пор не жалею
...
Рейтинг: 0 / 0
14.05.2005, 21:37
    #33065543
SomeGuest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как передать BLOB через XML?
funikovyuriА! Это я перед переходом на java выдал :) С тех пор не жалею

Не жалеешь, что на Java перешёл? А почему? Я вот всё думаю - что же круче Java или .NET?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / как передать BLOB через XML? / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]