首页 > 解决方案 > 我们如何将画布图像数据作为附件发送到 Pharo 上的服务器?

问题描述

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

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

在我的情况下,我不想发送/上传在机器上下载的文件,而是想发送/上传托管在某处的文件或我通过网络检索的数据并将其发送到另一台服务器。我们怎样才能做到这一点?

标签: smalltalkpharognu-smalltalkpharo-5pharo-6

解决方案


根据您之前的问题,我认为您使用的是 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 自动挂载单元来设置超时

/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,您甚至可以安全地存储凭据:

创建一个秘密文件以存储~/.davfs2/secrets用于用户和/etc/davfs2/secretsroot 的 WebDAV 服务的凭据:

/etc/davfs2/secrets

https://webdav.example/path davusername davpassword

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

# 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

编辑根据评论。

问题是ZnClientPharo 本身的配置和 json 文件也在那里生成。

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

ftp为例:

| commandOutput |

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

其他方法更明智。是通过FileSystemNetwork使用 PharoFTPWebDav支持。

仅加载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是类似的。


推荐阅读