docker - 将文件上传到在 Docker 容器上运行的 eXist-db
问题描述
我在 docker 容器上使用 eXist-db - 在 Ubuntu 上安装 Java,安装 eXist 安装无头 jar,还添加数据卷(Azure 文件)来存储所有物理文件和 db 数据文件。
在生成新文件并将其保存到卷驱动器(使用 C#)后,我需要自动将文件上传到 eXist-db。
根据关于上传文件的 eXist 文档,有几种方法可以将文件上传到 eXist,但它们都不适合我。
- Dashboard 或 eXide - 不相关,因为它们是 GUI 应用程序。
- Java Admin Client - 因为没有 GUI 而无法工作 -> 我遇到了这个错误:'没有设置 X11 DISPLAY 变量,但是这个程序执行了一个需要它的操作......'
- 通过 Web 客户端(使用浏览器或通过代码)通过 REST 或 WebDAV,我可以运行 XQuery 进行查询,但对于存储新文件,如何?
因此,我找到的解决方案是使用该xmldb:store
函数编写一个 XQuery 文件。
此查询使用指定的名称和位置(在卷中)保存发布的文件,然后可以通过 REST 或 WebDAV 检索存储的文件。
但我觉得必须有一个更简单的解决方案......
任何人都可以帮忙吗?
顺便说一句,这里是xmldb:store
XQuery:
xquery version "3.1";
declare function local:upload() {
let $filename := request:get-uploaded-file-name("file")
let $log-in := xmldb:login("/db", "Admin", "admin")
let $file := "file:///usr/new_file_location.xml"
let $record := doc($file)
let $store := xmldb:store("/db/akn", "new_file_name.xml", $record)
return
<results>
<message>File {$file} has been stored.</message>
</results>
};
local:upload()
解决方案
当按照eXist Docker 文档中的描述启动 eXist 时——它侦听端口 8080——你可以访问所有 eXist 的标准端点:
- http://localhost:8080/exist/webdav/db 用于 WebDAV
- http://localhost:8080/exist/rest/db 用于 REST
- http://localhost:8080/exist/xmlrpc/db 用于 XML-RPC
- http://localhost:8080/exist/apps 用于安装在 /db/apps 中的应用程序。
当然,如果您已将 Docker 的 eXist 配置为侦听不同的端口,只需切换端口即可。
因此,要以编程方式将文件上传到 Dockerized eXist,您引用的文档文章Uploading files中概述的方法应该都可以工作:WebDAV、client.sh、Ant,甚至 curl。对于 WebDAV,如果您尚未配置用户和密码,您只需使用 URL http://localhost:8080/exist/webdav/db、用户名“admin”和空白密码进行连接。对于 Ant,请参阅Ant 任务文档。对于 curl,您将对 REST 接口执行 HTTP PUT 请求:
curl -s -f -H 'Content-Type: application/xml' \
-T <filename> \
--user <user>:<password> \
"http://localhost:8080/exist/rest/db/apps/<collection>/<filename>"
推荐阅读
- dart - 为 ExpansionPanelList 的头部和主体赋予不同的颜色
- mysql - GCP-SQL 在 MySQL 上设置多个 sql_mode 标志
- android - 如何避免打开同一个应用程序的两种风格的应用程序?
- android - onReceive 是进行调用者权限检查的正确方法吗?
- c++ - 可以单独使用这两个参数,但不能同时使用这两个参数
- ios - 导入和使用带有 Carthage 的 Swift SnapshotTesting 框架
- sql - 从一张表中删除另一张表中的数据
- java - 从 2 个 BLE 连接的设备并行获取数据
- javascript - 如何停止执行componentwillmount中的功能或动作?
- ruby-on-rails - 在自定义类中设计未定义的辅助方法