Загрузка текстовых файлов как двоичных файлов с использованием API MarkLogi c REST - PullRequest
1 голос
/ 15 марта 2020

Можно ли загрузить текстовый файл, независимо от его содержимого, в виде двоичного документа с помощью API MarkTogi c REST? Точнее, через конечную точку расширения ресурса?

Я вижу, что это возможно с помощью функции xdmp:document-load, но не совсем уверен, как это сделать с помощью API REST.

xdmp:document-load("C:\my\path\test.txt",
    map:map() => map:with("uri", "/test/test.txt")
              => map:with("format", "binary")
)

У меня есть попытался загрузить тот же документ через PUT /v1/documents API и установить для параметра format значение binary. Но он все еще был загружен как text файл.

Вариант использования: мне нужно загрузить несколько файлов вложений, которые иногда содержат некоторые текстовые файлы. Мне не нужен MarkLogi c для индексации их содержимого, и на самом деле многие из этих файлов имеют проблемы с кодировкой или форматом, если MarkLogi c пытается это сделать.

Спасибо!

1 Ответ

3 голосов
/ 15 марта 2020

С / v1 / documents PUT параметр format используется для указания формата метаданных, а не документа.

Как описано в Управление типом содержимого ввода и вывода

  • Первичный: сопоставление типа MIME расширения URI, если в запросе не указано функция преобразования.
  • Откат: Отображение типа MIME заголовка типа содержимого. Для многокомпонентного ввода заголовок типа контента запроса должен быть составным / смешанным, поэтому заголовок типа контента для каждой части указывает MIME-тип контента для этой части.

Ресурс Расширение файла из URI документа используется для поиска настроенного Mimetype. Он будет использовать format для сконфигурированного Mimetype, если есть соответствующая запись.

К сожалению, явный заголовок Content-type не отменяет неявное определение format. Таким образом, если вы хотите загрузить документ с расширением .txt как документы binary(), вам нужно будет применить некоторые обходные пути.

Чтобы загрузить текстовые документы как binary() с /v1/documents PUT вы могли бы:

  • Использовать другое расширение файла. Добавьте ".bin" в конец URI текстового файла, т.е. /myTextFile.txt.bin. Это может быть нежелательно, поскольку оно действительно изменяет URI документов по сравнению с тем, чем оно является на самом деле, но указывает на то, что текст c сохраняется как двоичный документ.
  • Применяет пользовательское преобразование, когда загрузите документы и укажите желаемый Content-type

Пример сквозного преобразования, которое можно применить, чтобы неявное определение URL format не применялось, и явный заголовок Content-type применяется:

function noop(context, params, content){
  return content;
} 
exports.transform=noop

После установки пользовательского преобразования с именем noop: Ниже приведен пример команды curl, которая устанавливает преобразование n oop. Обновите имя пользователя / пароль соответствующим образом:

curl --anyauth --user myUsername:myPassword -X PUT -i -d "function noop(context, params, content){return content;} exports.transform=noop" -H "Content-type: application/vnd.marklogic-javascript" http://localhost:8000/LATEST/config/transforms/noop

Затем можно вызвать /v1/documents PUT и указать Content-type в качестве двоичного Mimetype (в этом примере, как application-octet-stream):

curl --anyauth --user myUsername:myPassword -T ./test.txt -i -H "Content-type: application/octet-stream" "http://localhost:8000/v1/documents?uri=/test.txt&transform=noop"

и он будет загружен как binary() вместо text()

doc("/test.txt")/node()/xdmp:node-kind(.)

выход: binary

...