FileApiService загрузка документа в файлы и примечания CRM системы
Доброго времени суток, есть вопрос следующего характера
У меня есть расширяющий модуль для FileDetailV2
Внутри него я получаю контент PDF документа (контент строкой)
Каким образом мне этот контент передать на FileApiService модуль в метод Upload что бы загрузить этот файл?
Если я загружаю руками документ то получаю в консоли POST запрос на
https://testDomain.bpmonline.com/0/rest/FileApiService/Upload?fileapi14996709535744&totalFileLength=47386&fileId=file_id&mimeType=application%2Fpdf&columnName=Data&fileName=20846491.pdf&parentColumnName=Document&parentColumnValue=parent_document_value&entitySchemaName=DocumentFile
И также интересно как в JS получить текущий entitySchemaName?
Нравится
"Nickstery" написал:Но в url есть значение file_id откуда мне его взять если файл еще не создан?
Это просто новый рандомный гуид по которому далее файл можно будет получить, создать новый гуид можно следующим образом:
https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascri…
"Максим Шевченко" написал:
Nickstery пишет:
Но в url есть значение file_id откуда мне его взять если файл еще не создан?
Это просто новый рандомный гуид по которому далее файл можно будет получить, создать новый гуид можно следующим образом:
https://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
С формированием параметра понятно
Каким образом отправлять контент файла в теле запроса, это form-data по ключу определенному или передаеться как binary data?
Если я формирую запрос в Postman (приложение для отправки запросов) как приведено ниже
Я получаю следующий ответ:
Есть где-то дока какой ендпоинт/модуль какие есть методы, и какие поля нужно отправлять что бы загрузить документ?
Не совсем понятно каким образом проиходит передача самого документа
Я набросал кусок кода, который получает контент файла, формирует BLOB и пытаеться отправить его на FilApiService Только я получаю ту же ошибку
window.console.log("Try to grab the file content"); var http = new XMLHttpRequest(); http.open("get", "https://b981fab7.ngrok.io/getPDF", true); http.responseType = "arraybuffer"; http.onload = function(e) { if (this.status === 200) { var uInt8Array = new Uint8Array(this.response); var i = uInt8Array.length; var binaryString = new Array(i); while (i--) { binaryString[i] = String.fromCharCode(uInt8Array[i]); } var data = binaryString.join(""); var http2 = new XMLHttpRequest(); http2.open("post", "/0/rest/FileApiService/Upload?fileapi14998570381414&totalFileLength=47386&" + "fileId=*****&mimeType=application/pdf&columnName=Data" + "&fileName=20846491.pdf&parentColumnName=Document" + "&parentColumnValue=***&entitySchemaName=DocumentFile", true); http2.onload = function(e) { window.console.log("UPLOAD FILE OPERATION DONE"); window.console.log(e); }; http2.send(new Blob([data])); } }; http.send();
Разобрался:
Суть в том что при расширении FileDatailV2 (логично) мы унаследуем и методы оринильного модуля.
Можно не использовать FileApiService и не генерировать 100500 параметров а просто обойтись готовым решением, как это делает аплоад документа юзер, который находится в CRM.
Достаточно использовать FileDetailV2 -> onFileSelect метод и из строчного контента сгенерировать window.File
Пример как я это реализовал ниже:
window.console.log("Try to grab the file content"); var http = new XMLHttpRequest(); http.open("get", "https://b981fab7.ngrok.io/getPDF", true); http.responseType = "blob"; var parent = this; http.onload = function(e) { if (http.readyState === 4) { var blob = http.response; parent.onFileSelect([new window.File([blob], "UPLOADED.pdf")]); } }; http.send();
Таким образом не нужно думать как приатачить документ в таблицу после его загрузи, это все делает модуль автоматически
У меня задача как раз стоит чтобы загрузить файл, но не из интерфейса приложения, а сторонним приложением. И мне необходимо использовать FileApiService. Как правильно им пользоваться? Может кто нибудь показать рабочий пример кода?
Руслан, пример есть здесь, а увидеть, какие запросы отправляются сервису можно в Fiddler и подобных инструментах.
Установил фидлер и при включенном захвате трафика выходит такая ошибка:
Зато удалось в консоли разработчика увидеть запрос отправленный на сервер:
https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…
При попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку:
400 Bad request
Может, что-то не то с заголовками или content type содержимого, не знаю. А если прямо в браузере отловить?
Отловил запрос прямо в браузере, вот:
https://my.domain.com/0/rest/FileApiService/Upload?fileapi1606730904835…
Но при попытке отправить этот запрос из POSTMAN, сервер возвращает ошибку:
400 Bad request
Можно попробовать сравнить запрос с нормально работающим, поискать в чём отличия в содержимом.
Зверев Александр,
Так в том и вопрос, какой он нормально работающий запрос. Я ни как не могу его найти. Могли бы вы предоставить пример рабочего запроса? Буду очень признателен.
Нормальный запрос идёт из браузера при добавлении файла на деталь. Но Вы, видимо, его и так уже видели:
Request URL: https://0987561-se-m-se-demo.creatio.com/0/rest/FileApiService/Upload?fileapi16068281951725&totalFileLength=42738&fileId=0015222a-e192-4e2d-a305-7029653b76eb&mimeType=image%2Fpng&columnName=Data&fileName=test.png&parentColumnName=Contact&parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&entitySchemaName=ContactFile Request Method: POST Status Code: 200 Remote Address: 40.91.213.136:443 Referrer Policy: strict-origin-when-cross-origin cache-control: private content-type: application/json; charset=utf-8 date: Tue, 01 Dec 2020 13:16:21 GMT server: Microsoft-IIS/10.0 status: 200 x-aspnet-version: 4.0.30319 x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-powered-by: ASP.NET :authority: 0987561-se-m-se-demo.creatio.com :method: POST :path: /0/rest/FileApiService/Upload?fileapi16068281951725&totalFileLength=42738&fileId=0015222a-e192-4e2d-a305-7029653b76eb&mimeType=image%2Fpng&columnName=Data&fileName=test.png&parentColumnName=Contact&parentColumnValue=eba7839a-6dff-430f-8325-fb8e02546348&entitySchemaName=ContactFile :scheme: https accept: */* accept-encoding: gzip, deflate, br accept-language: en-US,en;q=0.9,uk;q=0.8,ru;q=0.7 bpmcsrf content-disposition: attachment; filename=test.png content-length: 42738 content-range: bytes 0-42737/42738 content-type: image/png cookie: BPMSESSIONID=oq1w3q0l1yhedqm43aayja1a; _ga=GA1.2.656850260.1571905584; UserName=83|117|112|101|114|118|105|115|111|114; BPMLOADER=ytih30doaflbq4opdaauindd; _gid=GA1.2.1302014581.1606819455; .ASPXAUTH=0008CA5627819C22386A7FD7673D990C515D14E16AAA7C3E962C321AD5B73C8A2E390A6A6F5AE4DDD258B39ED90AE52BB05619534187DF76BBB1D1FF11B042E75619D72724CFE8E56619EEA9AC684DD352340A7212E60D621B3347E1116DE823140E48AE7FF68CE26734B92A9535C2C69D4BF9A6DE071595ECA44536D4EDF49958CBE863D46ABF8E86B2BAB87496310E5A25A03B4037A458240E6FAB1DFA93DE265821214B9C08D57C5CF3D2376E197C94AC1CF59BE9DA24BE2415465689C40BB1306488AB986D58ADCA8764F99566A0BCBB108248B7FB62678B541F509BC80525781C299A0A5FE2EB0F6997868942D0BD146D40C89B36E12CC760D7C05709175E01F26E6B67BF67846BE78BFE1E583A830ACFFF907A58B713DED3C10FC4E422C74DF27E792BADD1138259551A290978A88414B1CDC15E000D4A44B70BD9E296B74C0601BD3DDD315F2722EC95987F77427E73EB062C147611AD43A0DEE6B967AB07C932 origin: https://0987561-se-m-se-demo.creatio.com referer: https://0987561-se-m-se-demo.creatio.com/0/Nui/ViewModule.aspx sec-fetch-dest: empty sec-fetch-mode: cors sec-fetch-site: same-origin user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 x-requested-with: XMLHttpRequest fileapi16068281951725: totalFileLength: 42738 fileId: 0015222a-e192-4e2d-a305-7029653b76eb mimeType: image%2Fpng columnName: Data fileName: test.png parentColumnName: Contact parentColumnValue: eba7839a-6dff-430f-8325-fb8e02546348 entitySchemaName: ContactFile PNG IHDRТA7fsRGB®ÎégAMA±üa
Если его, то видел. Но повторить и выполнить самому, для начала из POSTMAN, ни как не получается из-за ошибки 400 Bad request.
Руслан, можно в Fiddler сравнить все заголовки правильного и неправильного запросов, может чего-то не хватать.