Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ? / 18 сообщений из 18, страница 1 из 1
22.11.2016, 22:00
    #39352274
u78
u78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
Код: 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
23.11.2016, 00:21
    #39352322
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 10:02
    #39352418
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 10:20
    #39352428
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 10:53
    #39352455
u78
u78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
Да, надо юзать %Stream.FileBinary а не %File
Спасибо коллеги
...
Рейтинг: 0 / 0
23.11.2016, 10:54
    #39352456
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 10:58
    #39352459
u78
u78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 11:27
    #39352499
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
servitЧем он лучше стандартных средств?
В свое время так же искали вариант "бинарного" чтения файлов... Насоветовали в то время такой вариант.
Кто именно насоветовал уже никто не помнит.
...
Рейтинг: 0 / 0
23.11.2016, 11:35
    #39352507
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 11:40
    #39352514
П.С.М.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 11:46
    #39352519
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
krvsa ,

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

Да и зачем менять что-то, если оно работает и не создает проблем?
...
Рейтинг: 0 / 0
23.11.2016, 13:40
    #39352673
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
23.11.2016, 13:48
    #39352682
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
krvsaДа и зачем менять что-то, если оно работает и не создает проблем?Между хорошим и лучшим существует разница.
...
Рейтинг: 0 / 0
23.11.2016, 14:33
    #39352748
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
servitМежду хорошим и лучшим существует разница.
А еще поговаривают, что лучшее - враг хорошего.
...
Рейтинг: 0 / 0
23.11.2016, 14:36
    #39352754
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
krvsaА еще поговаривают, что лучшее - враг хорошего.Без тестирования - безусловно.
...
Рейтинг: 0 / 0
23.11.2016, 16:41
    #39352868
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
servit , у нас есть клиенты со старинными версиями... Т.ч. не все новое и передовое у них вообще есть.
...
Рейтинг: 0 / 0
23.11.2016, 18:10
    #39352946
servit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ?
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
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Чтение бинарного файла вызывает ошибку TRANSLATE, как сохранить локальный файл в базе ? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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