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

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

Делаю следующее:
из БД вытаскиваю поле типа 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
как передать BLOB через XML?
    #33059776
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьми готовую библиотеку, которая в BASE64 кодирует, да и все, она вроде даже в стандартных api есть, вот только где и как называется не помню :)
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33059795
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как вы их обратно собирать думаете?

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

Мне еще рекомендовали через MIME кодировать, только я не нашел библиотеку для работы с этим чудом, я в яве недавно совсем...
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33060175
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
как передать BLOB через XML?
    #33060192
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет MIME'а есть класс MimeUtility, но он из Java Mail - правда никто не мешает его себе скопировать чтобы весь mail.jar не таскать
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33060375
Фотография Sehensucht! (потерял пароль)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
funikovyuri
Я про это. Выб их выравнивали чтоли, а то Integer он не обязательно 2 символа преобразуется...

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

Например, 0A или F0 так и будет отображено или останется только A и F соответственно?!
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33060523
Фотография 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
как передать BLOB через XML?
    #33060575
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чессо слово - используйте BASE64 или MIME. своих велосипедов и так хватает!
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33061007
задорнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
как передать BLOB через XML?
    #33063880
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
как передать BLOB через XML?
    #33063890
есть стандартные средства.
...
Рейтинг: 0 / 0
как передать BLOB через XML?
    #33063949
Kudinov Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sun.misc.Base64Decoder и sun.misc.Base64Encoder

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

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

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

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

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

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


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