Вопрос

Загрузка файлов через API.

Здравствуйте. Как можно загрузить файл через 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)),

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

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

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