如何从服务器下载图像,然后使用 R 将其上传到网站?

问题描述

好的,所以我在服务器上存储了大约 2 GB 的文件(图像和其他内容)(我现在使用的是 Cygwin,因为我在 Windows 上),我想知道我是否能够获得所有将这些数据转换为 R,然后最终将其翻译到一个网站上,人们可以在该网站上查看/下载这些图像?

我目前已经安装了 ssh 包并使用以下命令登录到我的服务器:

ssh::ssh_connect("name_and_server_ip_here")

我已经能够成功连接,但是,我不太确定如何通过 R 定位服务器上的文件。我假设我会使用类似 scp_download 从服务器下载文件,但如前所述,我不太确定如何从服务器中找到文件,所以我无论如何都无法下载它们(目前)!

任何形式的反馈和帮助将不胜感激!谢谢:)

解决方法

您可以使用 ssh::ssh_exec_internal 和一些 shell 命令来“查找”命令。

sess <- ssh::ssh_connect("r2@myth",passwd="...")
out <- ssh::ssh_exec_internal(sess,command = "find /home/r2/* -maxdepth 3 -type f -iname '*.log'")
str(out)
# List of 3
#  $ status: int 0
#  $ stdout: raw [1:70] 2f 68 6f 6d ...
#  $ stderr: raw(0) 

stdout/stderr 是原始的(远程命令没有产生 ascii 数据是可行的),所以我们可以使用 rawToChar 进行转换。 (如果您有非 ascii 数据,这可能不是控制台安全的,但它在这里,所以我会用它。)

rawToChar(out$stdout)
# [1] "/home/r2/logs/dns.log\n/home/r2/logs/ping.log\n/home/r2/logs/status.log\n"
remote_files <- strsplit(rawToChar(out$stdout),"\n")[[1]]
remote_files
# [1] "/home/r2/logs/dns.log"    "/home/r2/logs/ping.log"   "/home/r2/logs/status.log"

对于下载,scp_download 矢量化,因此我们一次只能上传一个文件。

for (rf in remote_files) ssh::scp_download(sess,files = rf,to = ".")
#    4339331 C:\Users\r2\.../dns.log
#   36741490 C:\Users\r2\.../ping.log
#   17619010 C:\Users\r2\.../status.log

对于上传,scp_upload 矢量化的,因此我们可以一次性发送所有内容。我将创建一个新目录(仅用于此示例,并且不会完全弄乱我的远程服务器 :-),然后上传它们。

ssh::ssh_exec_wait(sess,"mkdir '/home/r2/newlogs'")
# [1] 0
ssh::scp_upload(sess,files = basename(remote_files),to = "/home/r2/newlogs/")
# [100%] C:\Users\r2\...\dns.log
# [100%] C:\Users\r2\...\ping.log
# [100%] C:\Users\r2\...\status.log
# [1] "/home/r2/newlogs/"

(我觉得奇怪的是 scp_upload 是矢量化的,而 scp_download 不是。如果这是在 shell/终端上,那么对 scp 的每次调用都需要连接、验证、复制,然后断开连接,有点低效;由于我们使用的是保存的 sess 离子,我相信(未经验证)由于未对 R 函数进行矢量化,效率几乎没有损失.. . 虽然矢量化它仍然很容易。)