是否可以通过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尝试对其中的许多文件进行编码或格式化,则它们会出现编码或格式问题。
谢谢!
对于/ 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
,您可以:
/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