powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
18 сообщений из 18, страница 1 из 1
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352274
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Property MyStream As %Stream.GlobalBinary;

/// Write ##class(FCE.Webtest).FillStream()
ClassMethod FillStream( FileName As %String = "C:\InterSystems\Image.jpg")
{
    Set Obj = ..%New()

    Set FileObj = ##class(%File).%New(FileName)
    s ok = FileObj.Open("RS")
    
    Write "File size = "_FileObj.Size,!
    
    s ok = Obj.MyStream.CopyFrom(FileObj)
    If $$$ISERR(ok) Quit "CopyFrom "_$system.Status.GetErrorText(ok)
    
    Write "MyStream.Size = "_Obj.MyStream.Size_$Char(13,10)
    
    Set ok = Obj.%Save()
    If $$$ISERR(ok) Quit "%Save "_$system.Status.GetErrorText(ok)
    Quit $$$OK
}
Выдаёт ошибку:

Код: plaintext
CopyFrom ОШИБКА #5002: Ошибка: <TRANSLATE>zRead+7^%Library.File.1

Я ведь открываю его как stream, свойство MyStream - BinaryStream, при чём тут таблица трансляции???

Кто нибудь знает как загрузить локальный файл в базу? Это вообще возможно в Cache?
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352322
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78,

А если так?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ClassMethod FillStream(FileName As %String = "C:\InterSystems\Image.jpg")
{
    Set Obj = ..%New()

    //Set FileObj = ##class(%File).%New(FileName)
    //s ok = FileObj.Open("RS")
    
    Set FileObj=##class(%Stream.FileBinary).%New()
    Set FileObj.Filename=FileName
    
    Write "File size = "_FileObj.Size,!
    
    s ok = Obj.MyStream.CopyFrom(FileObj)
    If $$$ISERR(ok) Quit "CopyFrom "_$system.Status.GetErrorText(ok)
    
    Write "MyStream.Size = "_Obj.MyStream.Size_$Char(13,10)
    
    Set ok = Obj.%Save()
    If $$$ISERR(ok) Quit "%Save "_$system.Status.GetErrorText(ok)
    Quit $$$OK
}
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352418
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78Кто нибудь знает как загрузить локальный файл в базу? Это вообще возможно в Cache?Используем такой вариант...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
  /// Прочитать бинарный файл в глобал
  /// [Параметры]
  /// File* - Путь и имя файла
  /// Name* - Имя глобала
  /// Len - Количество символов в строке
binLoad(File,Name,Len)
  n len,of
  s:$g(Len)="" Len=200
  s len=0
  s of=##class(%FileBinaryStream).%New()
  s of.Filename=File
  k @Name
  f  d BINPART q:of.AtEnd
  k of
  q:$q len
  q
BINPART ; Очередная часть файла
  n str
  s str=of.Read(Len)
  s @Name@($i(@Name))=str
  i $i(len,$l(str))
  q
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352428
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78Я ведь открываю его как stream, свойство MyStream - BinaryStream, при чём тут таблица трансляции???При том, что Вы его не открываете как поток: "S" (/STREAM) - в данном случае это нечто другое .
Правильно так:
s ok = FileObj.Open(##class(%FileStreamAdaptor).#OPENREAD)
что равносильно
s ok = FileObj.Open("RUK\RAW\")
Чтобы обезопасить себя от ошибок, лучше - как правильно заметил П.С.М. - использовать соответствующие классы, а не универсальный %File.

PS: если Вы возвращаете строку, то строку, если статус - то статус. Смешивать два разных возвращаемых типа в одном методе - ошибка.
ClassMethod FillStream( FileName As %String = "C:\InterSystems\Image.jpg")  As %String or %Status?
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352455
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, надо юзать %Stream.FileBinary а не %File
Спасибо коллеги
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352456
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaИспользуем такой вариант...Чем он лучше стандартных средств?
Код: plaintext
1.
2.
3.
4.
5.
binLoad(File,Name) public {
  s of=##class(%Stream.FileBinary).%New(), of.Filename=File
  s t=##class(%Stream.GlobalBinary).%New(Name)
  d t.CopyFromAndSave(of)
  q t.Id
}
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352459
Фотография u78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

Вы неправы. В оригинальном примере я открываю его именно как поток.
Вот документация %Library.File метод Open():
авторmode is a string containing one or more file modes including:
R Read
W Write
S Stream mode
N Create a new file (overwrite existing file)

насчёт типов возврата вы можете поумничать в отдельном посте, спасибо
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352499
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЧем он лучше стандартных средств?
В свое время так же искали вариант "бинарного" чтения файлов... Насоветовали в то время такой вариант.
Кто именно насоветовал уже никто не помнит.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352507
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78 ,

Если файл локальный и/или он довольно большой, то можно хранить в БД не сам файл, а только ссылку на него, например так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Property MyStream As %Stream.FileBinary;

/// d $system.OBJ.DisplayError(##class(FCE.Webtest).FillStream())
ClassMethod FillStream(FileName As %String = "C:\InterSystems\Image.jpg") As %Status
{
  #dim ex As %Exception.AbstractException
  s res = $s(##class(%File).Exists(FileName):$$$OK,1:$$$ERROR($$$FileDoesNotExist,FileName))
  try {
    $$$ThrowOnError(res)
    
    s Obj = ..%New()
    
    $$$ThrowOnError(Obj.MyStream.LinkToFile(FileName))
    
    w "MyStream.Size = "_Obj.MyStream.Size_$$$NL
    
    $$$ThrowOnError(Obj.%Save())
  }catch(ex) {
    s res = ex.AsStatus()
  }
  q res
}
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352514
Фотография П.С.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit уже приводил ссылку, что такое S:

http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GIOD_rmsseqfiles#GIOD_rmsseq_openparamstbl S /STREAM Stream format with carriage return, line feed, or form feed as default terminators. Jobbed processes that inherit TCP devices are automatically set to “S” format. You can reset the format with the USE command. S, V, F, and U modes are mutually exclusive. Stream record format is the default on non-OpenVMS systems. Variable length (V) is the default on OpenVMS systems.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352519
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa ,

То, что это legacy-код - понятно, непонятно зачем его использовать сегодня при наличии готовых средств?
Как минимум, в нём можно увеличить размер блока при чтении файла с 200 байт до 32767 или даже 3641144. Точнее можно определить по $zutil(96,39). Это значительно ускорит чтение файла.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352658
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitнепонятно зачем его использовать сегодня при наличии готовых средств?
Дело в том, что у нас два "комплекта" "системных" программ, для Каше и для ГТ.М...
Меняя комплект получаем ПО для нужной СУБД... "Прикладные" программы работают только через "системные" процедуры и функции...
Т.о. нет разницы в какой СУБД импортировали файл, глобал получится как нужно и нужными "порциями".

Да и зачем менять что-то, если оно работает и не создает проблем?
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352673
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
u78Вы неправы. В оригинальном примере я открываю его именно как поток.
Вот документация %Library.File метод Open():Что такое "stream mode" выше уже процитировал П.С.М.. Этот режим никоим образом не означает, что Вы работаете именно с двоичным потоком.
Это легко проверить:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
ClassMethod FillStream(
  FileName As %String = {$$GetFilename^%apiCSP("/csp/samples/ClassLogo.jpg")},
  Mode As %String = "RUK\RAW\")
{
  #dim ex As %Exception.AbstractException
  s res = $s(##class(%File).Exists(FileName):$$$OK,1:$$$ERROR($$$FileDoesNotExist,FileName))
  try {
    $$$ThrowOnError(res)
    
    s of=##class(%File).%New(FileName)
    $$$ThrowOnError(of.Open(Mode))
    s s="" ; читаем сюда содержимое файла
    while 'of.AtEnd {
      s s=s_of.Read()
    }
    d of.Close()
    
    w of.Size,$s(of.Size=$l(s):"=",1:"≠"),$l(s),!
    
  }catch(ex) {
    w !,ex.DisplayString(),!
  }
}
Результаты:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
USER>d ##class(FCE.Webtest).FillStream(,"R")
2077≠1491
 
USER>d ##class(FCE.Webtest).FillStream(,"RS")
2077≠1491
 
USER>d ##class(FCE.Webtest).FillStream(,"RU")
2077≠1538
 
USER>d ##class(FCE.Webtest).FillStream(,"RSK\RAW\")
2077≠2053
 
USER>d ##class(FCE.Webtest).FillStream(,"RUK\RAW\")
2077=2077

Цифры отличаются, поскольку это зависит ещё и от настроек локали: Default I/O Tables
У меня это локаль rusw, где для файлов по умолчанию используется таблица UTF8, что для бинарных файлов не подходит от слова совсем.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352682
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaДа и зачем менять что-то, если оно работает и не создает проблем?Между хорошим и лучшим существует разница.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352748
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitМежду хорошим и лучшим существует разница.
А еще поговаривают, что лучшее - враг хорошего.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352754
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaА еще поговаривают, что лучшее - враг хорошего.Без тестирования - безусловно.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352868
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit , у нас есть клиенты со старинными версиями... Т.ч. не все новое и передовое у них вообще есть.
...
Рейтинг: 0 / 0
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
    #39352946
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaу нас есть клиенты со старинными версиями... Т.ч. не все новое и передовое у них вообще есть.Если есть %FileBinaryStream, значит должен быть и %GlobalBinaryStream, который есть даже в 5.0.x:
Код: plaintext
1.
2.
3.
 s of=##class(%FileBinaryStream).%New()
 s of.Filename=File
 s t=##class(%GlobalBinaryStream).%New(Name)
 d t.CopyFromAndSave(of)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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