Как отправить данные изображения холста в виде вложения на сервер в 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 будет похожим.