Как отправить данные изображения холста в виде вложения на сервер в Pharo? - PullRequest
0 голосов
/ 03 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 04 сентября 2018

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

Создайте файл секретов для хранения учетных данных для WebDAV-сервиса, используя ~/.davfs2/secrets для пользователя и /etc/davfs2/secrets для root:

/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 будет похожим

...