Как отправить данные изображения холста в виде вложения на сервер в Pharo?

Как отправить или загрузить файл данных на сервер на Pharo. Я видел пример отправки файла из каталога на машине. Работает нормально.

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

В моем случае я не хочу отправлять / выгружать файл, загруженный на компьютер, но вместо этого я хочу отправить / выгрузить файл, размещенный где-либо, или данные, которые я получил по сети, и отправить их, прикрепленные к другому серверу. Как мы можем сделать это?

1 ответ

Решение

Исходя из ваших предыдущих вопросов, я предполагаю, что вы используете 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

Есть два разумных способа его настройки - systemd или же fstab, Информация ниже взята из вики davfs2 Arch:

За 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 вы можете даже безопасно хранить учетные данные:

Создать файл секретов для хранения учетных данных для 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.

Другой подход более разумный. Это использовать Pharo FTP или же WebDav поддержка через FileSystemNetwork.

Чтобы загрузить только 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 будет похожим.

Другие вопросы по тегам