我们如何将 canvas 图像数据作为附件发送到 Pharo 上的服务器?

How do we send a canvas image data as an attachment to a server on Pharo?

我们如何将数据文件发送或上传到 Pharo 上的服务器。我看到了一些从机器上的目录发送文件的例子。 它工作正常。

ZnClient new
  url: MyUrl;
  uploadEntityfrom: FileLocator home /Path to the file;
  put

在我的例子中,我不想 send/upload 文件下载到机器上,而是我想 send/upload 托管在某处的文件或我通过网络检索的数据并将其附加发送到另一台服务器。 我们该怎么做?

根据您之前的问题,我推测您正在使用 linux。这里的问题不在 Smalltak/Pharo 内,而是网络映射。

FTP

如果你想要一个ftp,不要忘记它是以明文形式发送密码,设置它的方式你可以挂载它。可能有很多方法可以做到这一点,但您可以尝试使用 curlftpfs。为此,您需要内核模块 fuse,确保已加载它。如果未加载,您可以通过 modprobe fuse.

用法为:

curlftpfs ftp.yoursite.net /mnt/ftp/ -o user=username:password,allow_other

填写用户名/密码。选项 allow_other 允许系统中的其他用户使用您的坐骑。 (有关更多详细信息,您可以查看 arch wiki 及其 curlftpfs

Webdav

对于 webdav 我将使用相同的方法,这次使用 davfs

您可以通过 mount 命令手动安装它:

mount -t davfs https://yoursite.net:<port>/path /mnt/webdav

有两种合理的设置方式 - systemdfstab。以下信息摘自 davfs2 Arch wiki:

对于systemd

/etc/systemd/system/mnt-webdav-service.mount

[Unit]
Description=Mount WebDAV Service
After=network-online.target
Wants=network-online.target

[Mount]
What=http(s)://address:<port>/path
Where=/mnt/webdav/service
Options=uid=1000,file_mode=0664,dir_mode=2775,grpid
Type=davfs
TimeoutSec=15

[Install]
WantedBy=multi-user.target

您可以创建一个 systemd automount 单元来设置 timeout:

/etc/systemd/system/mnt-webdav-service.automount

[Unit]
Description=Mount WebDAV Service
After=network-online.target
Wants=network-online.target

[Automount]
Where=/mnt/webdav
TimeoutIdleSec=300

[Install]
WantedBy=remote-fs.target

对于 fstab 方法,如果您之前编辑过 fstab 就很容易(它的行为与任何其他 fstab 条目相同):

/etc/fstab

https://webdav.example/path /mnt/webdav davfs rw,user,uid=username,noauto 0 0

对于 webdav,您甚至可以安全地存储凭据:

创建一个秘密文件来存储 WebDAV 服务的凭据,用户使用 ~/.davfs2/secrets,根用户使用 /etc/davfs2/secrets

/etc/davfs2/secrets

https://webdav.example/path davusername davpassword

确保机密文件包含正确的权限,用于 root 挂载:

# chmod 600 /etc/davfs2/secrets
# chown root:root /etc/davfs2/secrets

并且对于用户安装:

$ chmod 600 ~/.davfs2/secrets

返回您的 Pharo/Smalltalk 代码:

我假设您已阅读以上内容并安装了 /mnt/ftp/mnt/webdav

例如ftp 您的代码只需从安装的目录中获取:

ZnClient new
  url: MyUrl;
  uploadEntityfrom: FileLocator '/mnt/ftp/your_file_to_upload';
  put

编辑 根据评论。

问题是 ZnClient 的配置在 Pharo 本身中,json 文件也在那里生成。

一个快速而肮脏的解决方案 - 将使用上面提到的 shell 命令:

ftp为例:

| commandOutput |

commandOutput := (PipeableOSProcess command: 'curlftpfs ftp.yoursite.net /mnt/ftp/ -o user=username:password,allow_other') output.
Transcript show: commandOutput.

其他方法更明智。是通过 FileSystemNetwork.

使用 Pharo FTPWebDav 支持

只加载ftp:

Gofer it
    smalltalkhubUser: 'UdoSchneider' project: 'FileSystemNetwork';
    configuration;
    load.
#ConfigurationOfFileSystemNetwork asClass project stableVersion load: 'FTP'

仅加载 Webdav:

Gofer it
    smalltalkhubUser: 'UdoSchneider' project: 'FileSystemNetwork';
    configuration;
    load.
#ConfigurationOfFileSystemNetwork asClass project stableVersion load: 'Webdav'

获取包括测试在内的所有内容:

Gofer it
    smalltalkhubUser: 'UdoSchneider' project: 'FileSystemNetwork';
    configuration;
    loadStable.

有了它,你应该能够得到一个文件,例如 ftp:

| ftpConnection wDir file |

"Open a connection"
ftpConnection := FileSystem ftp: 'ftp://ftp.sh.cvut.cz/'.
"Getting working directory"
wDir := ftpConnection workingDirectory.
file := '/Arch/lastsync' asFileReference.
"Close connection - do always!"
ftpConnection close.

那么您通过 (ftp) 上传的内容将如下所示:

| ftpConnection wDir file |

"Open connection"
ftpConnection := FileSystem ftp: 'ftp://your_ftp'.
"Getting working directory"
wDir := ftpConnection workingDirectory.
file := '/<your_file_path' asFileReference.
ZnClient new
     url: MyUrl;
     uploadEntityfrom: FileLocator file;
     put
"Close connection - do always!"
ftpConnection close.

Webdav 类似。