Здравствуйте. Как можно загрузить файл через API (odata) и прикрепить его к определенному контакту/лиду/заданию/звонку и тп? Пробовал через модели odata, но выдавало ошибку, что такая модель еще не доступна. Скорее всего, я что-то не так делал. Может кто-то сталкивался с таким вопросом. Буду рад любой помощи. Спасибо.

Нравится

9 комментариев

как по мне очень похоже на вот это: https://community.terrasoft.ru/questions/realizacia-peredaci-pdf-dokume…;

Там конечно про pdf, но описанные действия вроде подходят для всех типов файлов. 

Спасибо. Сейчас делаю так:

1. POST запрос с привязкой к контакту и задаю название файла.

2. PUT запрос передаю файл.

Но на 2 этапе возникает проблема. Когда я передаю файл через POSTMAN и позже его скачиваю из CRM. Файл не открывается должным образом. Открыв файл через notepad++ и забрав такие заголовки

----------------------------606529554623297003963904
Content-Disposition: form-data; name=""; filename="bcr_scren.png"
Content-Type: image/png

картинка (в данном случае) открывается нормально.

При этом я создал PHP скрипт у себя на сервере для загрузки файлов и передаю точно такие-же параметры и заголовки как и в CRM. Файл загружается без проблем.

Скрин из POSTMANa:

Заголовок запроса такой: Content-Type: multipart/form-data.

Вы используете обычный EntityDataService. Но, судя по ссылке, есть отдельный FileApiService именно для работы с файлами. Примеры работы с ним можно увидеть в самой системе на детали файлов, а уходящие из браузера запросы на сервер посмотреть в Fiddler.

См. примеры тут.

Посмотрите, как работает с файлами через этот сервис интерфейс системы. Готовых примеров решения такой задачи на PHP нет, поскольку bpm'online использует JS на клиенте и С#  на сервере. Следовательно, найти примеры на этих языках шансов намного больше.

Запустил Fiddler, добавил файл на деталь, POST-запросы к сервисам записались нормально. Сначала собственно добавление:

/0/rest/FileApiService/Upload?fileapi15301911041375&totalFileLength=13036&fileId=935b6ecb-3509-4c8a-bc7e-03ab0661da24&mimeType=&columnName=Data&fileName=myfilename.rar&parentColumnName=Contact&parentColumnValue=c4ed336c-3e9b-40fe-8b82-5632476472b4&entitySchemaName=ContactFile

В качестве содержимого запроса — сам файл.

Потом запрос на выборку :

/0/DataService/json/SyncReply/SelectQuery

С содержимым:

{"rootSchemaName":"ContactFile","operationType":0,"filters":{"items":{"primaryColumnFilter":{"filterType":1,"comparisonType":3,"isEnabled":true,"trimDateTimeParameterToDate":false,"leftExpression":{"expressionType":1,"functionType":1,"macrosType":34},"rightExpression":{"expressionType":2,"parameter":{"dataValueType":0,"value":"935b6ecb-3509-4c8a-bc7e-03ab0661da24"}}}},"logicalOperation":0,"isEnabled":true,"filterType":6},"columns":{"items":{"Id":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Id"}},"Name":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Name"}},"Type":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Type"}},"Version":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Version"}},"CreatedBy":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"CreatedBy"}},"Notes":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":0,"columnPath":"Notes"}},"EntryPointsCount":{"caption":"","orderDirection":0,"orderPosition":-1,"isVisible":true,"expression":{"expressionType":3,"aggregationType":1,"columnPath":"[EntryPoint:EntityId].Id","subFilters":{"items":{"c11b1561-6443-42de-8768-f6db6d774678":{"filterType":1,"comparisonType":3,"isEnabled":true,"trimDateTimeParameterToDate":false,"leftExpression":{"expressionType":0,"columnPath":"IsActive"},"rightExpression":{"expressionType":2,"parameter":{"dataValueType":1,"value":true}}}},"logicalOperation":0,"isEnabled":true,"filterType":6}}}}},"isDistinct":false,"rowCount":-1,"rowsOffset":-1,"isPageable":false,"allColumns":false,"useLocalization":true,"useRecordDeactivation":false,"serverESQCacheParameters":{"cacheLevel":0,"cacheGroup":"","cacheItemName":""},"isHierarchical":false}

 

 

 

 

 

Зверев Александр,

Так и делаю, шлю POST на URL

https://bookimed.bpmonline.com/0/rest/FileApiService/Upload?fileapi15301911041375&totalFileLength=".filesize($localfile)."&fileId=" . $fileId . "&mimeType=&columnName=Data&fileName=test.png&parentColumnName=Order&parentColumnValue=f106146d-817a-4359-a7a8-a2386c14c7bb&entitySchemaName=OrderFile

А в ответ получаю The server encountered an error processing the request. The exception message is 'Невозможно определить размер файла'

Хотя я передаю totalFileLength в строке запроса - эту ошибку тоже вспоминали тут https://community.terrasoft.ru/questions/fileapiservice-zagruzka-dokume… и но не объяснили как побороть

Видимо, размер реально оказывается не тот или не в том формате. Сравните в Fiddler Ваш и автоматический запросы.

Зверев Александр,

 Разобрался! Нужно в хэдере еще указывать

'Content-Range: bytes 0-'.(filesize(realpath($localfile))-1).'/'.filesize(realpath($localfile)),

АПИ уже работает и отвечает ОК

Спасибо за важное уточнение.

Показать все комментарии

I found a few discussions about using filestreams in Terrasoft applications. The last one was at http://www.community.terrasoft.ua/forum/topic/7454. So I decided to share instruction and some scripts, that are needed to setup filestreams for tbl_Files table, as a separate blog post. The solutions is tested in few projects.
It also can be used for tbl_MailMessage and other tables, that contains column with datatype IMAGE.

Why to setup filestreams is also discussed in previous topics.

After making these changes there might be a problem to add new workspace, that contains Files detail using TS Master window or PVC, because the service tbl_Files can not be saved correctly, so some workarounds are needed, for example, You can create workspace with Terrasoft Master window without Files detail, and add this detail manually, if needed.

1. Make DATABASE backup

2. CREATE filestream files
ALTER DATABASE DATABASE_NAME ADD filegroup FileStreamGroup1 CONTAINS filestream
ALTER DATABASE DATABASE_NAME ADD FILE (NAME = FileStreamFile1, FILENAME = 'f:\database\tcr_xxx_332_lt\FileStreamData') TO FILEGROUP FileStreamGroup1;

3. Make COLUMN copy
ALTER TABLE tbl_Files ADD FileDataBackup IMAGE;
UPDATE tbl_Files SET FileDataBackup = FileData;

4. FOR ALL tbl_FileIn..  do this

DROP TRIGGER tr_tbl_FileInAccount_ID
ALTER TABLE dbo.tbl_FileInAccount DROP CONSTRAINT FFileInAccountFileID
ALTER TABLE dbo.tbl_FileInAccount ADD CONSTRAINT FFileInAccountFileID FOREIGN KEY ( FileID ) REFERENCES dbo.tbl_Files ( ID ) ON UPDATE NO ACTION ON DELETE CASCADE

DROP TRIGGER tr_tbl_FileInContact_ID
ALTER TABLE dbo.tbl_FileInContact DROP CONSTRAINT FFileInContactFileID
ALTER TABLE dbo.tbl_FileInContact ADD CONSTRAINT FFileInContactFileID FOREIGN KEY ( FileID ) REFERENCES dbo.tbl_Files ( ID ) ON UPDATE NO ACTION ON DELETE CASCADE

...

5. tbl_FileRight AND tbl_Files instead of TRIGGER

ALTER TABLE dbo.tbl_FilesRight DROP CONSTRAINT FFilesRightRecordID
ALTER TABLE dbo.tbl_FilesRight ADD CONSTRAINT FFilesRightRecordID FOREIGN KEY ( RecordID ) REFERENCES dbo.tbl_Files ( ID ) ON UPDATE NO ACTION ON DELETE CASCADE
DROP TRIGGER tr_tbl_Files_ID

6. CHANGE FileData COLUMN type TO VARBINARY(MAX):

ALTER TABLE tbl_Files DROP COLUMN FileData;
ALTER TABLE tbl_Files ADD FileData VARBINARY(MAX) filestream;


7. Move DATA TO updated COLUMN
UPDATE tbl_Files SET FileData = FileDataBackup
ALTER TABLE tbl_Files DROP COLUMN FileDataBackup

8. DROP vw_Files triggers
DROP TRIGGER tr_vw_Files_ID
DROP TRIGGER tr_vw_Files_IU

9. Recreate files VIEW
ALTER VIEW [dbo].[vw_Files]
AS
  SELECT [P].*
  FROM [dbo].[tbl_Files] AS [P] WITH(nolock)
  WHERE EXISTS (
    SELECT * FROM [dbo].[tbl_FilesRight] AS [R] WITH(nolock)
    WHERE (([R].[RecordID] = [P].[ID])
    AND EXISTS(
      SELECT * FROM [dbo].[tbl_UserAdminUnit] AS [U] WITH(nolock)
      WHERE ([R].[AdminUnitID] = [U].[AdminUnitID])
      AND ([U].[UserName] = SYSTEM_USER))))
GO

10. Make additional triggers OR modifications IN TS client side TO make correct access rights TO the files

Нравится

Поделиться

0 комментариев
Показать все комментарии