powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кодирование файла в Base64
32 сообщений из 32, показаны все 2 страниц
Кодирование файла в Base64
    #39547213
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, подскажите, надо очень срочно.

В базе файлы хранятся в поле Blob. Требуется получить файл в json поле в формате Base64.

Делаю таким образом, но файл оказывается не в кодировке Base64.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 MemoryStream := TMemoryStream.Create();
        BlobStream := TBlobStream.Create(TBlobField((frmDM.Select('SELECT fileblob FROM s_attachment WHERE ID=:pID', [TParamQuery.Create('pID', qSolutionsList.FieldByName('S_ATTACHMENT_ID').AsInteger)]).Fields[0])), bmRead);
        try
          MemoryStream.LoadFromStream(BlobStream);
          fsoAttachment.S['name'] := qSolutionsList.FieldByName('FILENAME').AsString;
          fsoAttachment.S['content'] := EncodeString(StreamToString(MemoryStream));
        finally
          BlobStream.Free;
          MemoryStream.Free;
        end;



Вопрос что делаю неправильно?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547400
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а твой EncodeString() рабочий?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547437
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

А вот как проверить, сейчас сделал проверку на D2010:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TfrmMain.dxBarButton2Click(Sender: TObject);
var
  s: string;
begin
  s := 'текст для кодирования';
  EncodeString(s);
  ShowMessage(EncodeString(s));
  ShowMessage(DecodeString(EncodeString(s)));
end;



В итоге после кодирования и раскодирования получаю исходную строку.
После кодирования получаю строку как на скрине. Верно ли все ?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547449
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Верно, "текст для кодирования" = 8uXq8fIg5Ov/IOru5Ojw7uLg7ej/

А что в файле получается?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547453
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetВ итоге после кодирования и раскодирования получаю исходную строку.
После кодирования получаю строку как на скрине. Верно ли все ?
http://foxtools.ru/Base64
Результат: текст для кодирования
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547455
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisher,

Ничего не понимаю, делаю вот таким образом:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TfrmMain.dxBarButton2Click(Sender: TObject);
var
  s, s1: string;
  Bytes: TBytes;
begin
  s := 'йцукен';
  EncodeString(s);
  ShowMessage(EncodeString(s));
  ShowMessage(DecodeString(EncodeString(s)));

  s1 := 'йцукен';
 //  Кодирование.
  Bytes := TEncoding.UTF8.GetBytes(s1);
  s1 := IdEncoderMIME1.EncodeBytes(Bytes);
  ShowMessage(s1);
end;



Результаты на скрине, почему они разные...
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547461
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И какую кодировку выбрать UTF-8 или Unicode для Delphi2010?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547463
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Чего непонятного-то? EncodeString кодирует строку в Win1251 (интересно, только, почему не в UTF-16LE), a EncodeBytes кодирует строку в UTF-8, поэтому и результаты разные.
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547465
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,
Откуда вообще взялась эта EncodeString, из какого модуля?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547470
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спрошу просто - как правильно кодировать строку? Запутался...
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547473
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
03.11.2017 14:50, wsnet пишет:
> Спрошу просто - как правильно кодировать строку?

ты сперва с кодировками определись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547474
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё верно -- в последних версиях это и есть EncodeString: 10468470
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547482
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiВсё верно -- в последних версиях это и есть EncodeString: 10468470
Почему тогда она в юникодной 2010 кодирует строку как ANSI?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547484
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

а как должна? Base64 -- это и есть обычный ансишный текст из английского алфавита. Специально, чтобы проблем с кодировками не было при обмене сообщениями (теми же письмами).

Вот тут другой вариант есть через tencoding: 20754405
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547485
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
для формирования json-файла в программе использую:

Код: pascal
1.
2.
3.
     PostData := TStringStream.Create(fso.asJson(true, false), TEncoding.UTF8);       
      try
        PostData.SaveToFile('Sstu\' + IntToStr(qExport.FieldByName('NUMREG').AsInteger) + '.json');



Тогда русские буквы отображаются при передачи json-файла корректно!
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547487
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
fsoAttachment.S['content'] := Soap.EncdDecd.EncodeBase64(MemoryStream.Memory, MemoryStream.Size);


Про MemoryStream.Position не пишу.
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547488
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

подскажите как правильно решить задачу перекодировки в моем случаи запутался совсем...
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547490
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDialekcvp,
а как должна? Base64 -- это и есть обычный ансишный текст из английского алфавита. Специально, чтобы проблем с кодировками не было при обмене сообщениями (теми же письмами).
Я знаю что такое base64. Посмотри пример выше - он исходную строку переводит из Unicode в ANSI перед кодировкой.
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547511
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

хз что он там переводит... Речь-то про файлы? А раз файлы, то и работать надо не со строками, а с потоками (т.е. байтами).

Вот рабочий пример:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
uses
  EncdDecd;

procedure TForm3.Button1Click(Sender: TObject);
var
  fileStream: TFileStream;
  base64Stream: TStringStream;
begin
  // грузит файл с данными (в т.ч. бинарными)
  fileStream := TFileStream.Create('D:\test\file1.txt', fmOpenRead);
  base64Stream := TStringStream.Create;

  // кодирует поток в base64
  EncodeStream(fileStream, base64Stream);

  // показывает результат
  ShowMessage(base64Stream.DataString);

  FreeAndNil(fileStream);
  FreeAndNil(base64Stream);
end;
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547514
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

ааа, понял о чем речь -- да, в первом посте некорректно делается у автора -- содержимое файла не надо преобразовывать в строку, т.е. выделенное красным убрать и сделать преобразование по примеру выше:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 MemoryStream := TMemoryStream.Create();
        BlobStream := TBlobStream.Create(TBlobField((frmDM.Select('SELECT fileblob FROM s_attachment WHERE ID=:pID', [TParamQuery.Create('pID', qSolutionsList.FieldByName('S_ATTACHMENT_ID').AsInteger)]).Fields[0])), bmRead);
        try
          MemoryStream.LoadFromStream(BlobStream);
          fsoAttachment.S['name'] := qSolutionsList.FieldByName('FILENAME').AsString;
          fsoAttachment.S['content'] := EncodeString(StreamToString(MemoryStream));
        finally
          BlobStream.Free;
          MemoryStream.Free;
        end;
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547518
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

вот исправленный вариант, должен работать корректно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
var
  blobStream: TBlobStream;
  stringStream: TStringStream;
begin
  blobStream := TBlobStream.Create(TBlobField((frmDM.Select('SELECT fileblob FROM s_attachment WHERE ID=:pID',
    [TParamQuery.Create('pID', qSolutionsList.FieldByName('S_ATTACHMENT_ID').AsInteger)]).Fields[0])), bmRead);
  stringStream := TStringStream.Create;
  try
    EncodeStream(blobStream, stringStream);

    fsoAttachment.S['name'] := qSolutionsList.FieldByName('FILENAME').AsString;
    fsoAttachment.S['content'] := stringStream.DataString;
  finally
    blobStream.Free;
    stringStream.Free;
  end;
end;
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547530
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,
Поясните почему stream не надо преобразовывать в string ?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547532
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Потому что файл состоит из двочных данных (байтов), которые никак в строку не засунуть в голом виде -- левые байты в лучшем случае пропадут-преобразуются, а в худшем, сама строка тупо обрежется где-нибудь на нулевом байте. Короче, данные из файла испортятся, если там хоть что-то будет отличное от текста.
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547548
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если MS SQL, то можно сразу с сервера получать Base64, не преобразуя в приложении, см. xs:base64Binary
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547563
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, а как проверить что файл верно зашифровался?
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547567
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

stringStream.LoadFromFile
EncodeString(stringStream, fileStream);
fileStream.SaveToFile
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547569
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто файл формируется 0 байт вообще.
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547570
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi,

DecodeString, конечно
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547575
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetПросто файл формируется 0 байт вообще.
См. работу с блоб-полями, тут я не подскажу. Сначала найти, в каком месте косяк (нет данных в запросе, нет данных в блоб-поле датасета, нет данных после преобразования, нет данных в результирующем json -- после каждой операции сохранять объект куда-нибудь на диск через SaveToFile и смотреть, когда будет пусто).
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547577
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, спасибо Вам огромное! Теперь мне все ясно! Вы очень помогайте!
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547588
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiwsnet,
stringStream.LoadFromFile
EncodeString(stringStream, fileStream);
fileStream.SaveToFile
Заработался, пятница? :)
Два TFileStream и из одного в другой Emcode Stream .
...
Рейтинг: 0 / 0
Кодирование файла в Base64
    #39547590
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiJaDi,
DecodeString, конечно
Я тоже заработался: Decode Stream
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Кодирование файла в Base64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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