[使用MarkLogic REST API将文本文件加载为二进制文件

问题描述 投票:1回答:1

是否可以通过MarkLogic REST API将文本文件(无论其内容如何)作为二进制文档加载?更具体地讲,是通过资源扩展终点吗?

我看到可以通过xdmp:document-load函数,但不太确定如何使用REST API做到这一点。

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文件加载。

用例是,我需要摄取一堆附件文件,其中有时包括一些文本文件。我不需要MarkLogic为其内容编制索引,实际上,如果MarkLogic尝试对其中的许多文件进行编码或格式化,则它们会出现编码或格式问题。

谢谢!

marklogic
1个回答
3
投票

对于/ v1 / documents PUT,format参数用于指示元数据的格式,而不是文档。

Controlling Input and Output Content Type中所述

  • 主:URI扩展MIME类型映射,只要请求未指定转换功能。
  • Fallback:内容类型标头MIME类型映射。对于多部分输入,请求的Content-type标头必须为多部分/混合的,因此每个部分的Content-type标头都指定该部分内容的MIME类型。

来自文档URI的资源文件扩展名用于查找已配置的Mimetype。如果有匹配的条目,它将使用format作为配置的Mimetype。

[不幸的是,显式Content-type标头没有覆盖隐式format确定。因此,如果要将具有.txt文件扩展名的文档作为binary()文档加载,则需要实现一些解决方法。

为了用binary()将文本文档加载为/v1/documents PUT,您可以:

  • 使用其他文件扩展名。将“ .bin”附加到文本文件URI的末尾,即/myTextFile.txt.bin。这可能是不希望的,因为它确实改变了文档的URI,但确实表明文本doc被存储为二进制文档。
  • 加载文档时应用自定义转换并指定所需的Content-type

可以应用的直通转换的示例,因此不应用隐式URL format检测,而应用显式Content-type标头:

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

installing the custom transform之后,名称为noop:以下是安装noop转换的示例curl命令。根据需要更新用户名/密码:

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

© www.soinside.com 2019 - 2024. All rights reserved.