【问题标题】:How do I download images from a server and then upload it to a website using R?如何从服务器下载图像,然后使用 R 将其上传到网站?
【发布时间】:2021-05-03 18:07:48
【问题描述】:

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

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

ssh::ssh_connect("name_and_server_ip_here")

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

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

【问题讨论】:

    标签: r windows web server cygwin


    【解决方案1】:

    您可以使用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 的每次调用都需要连接、验证、复制,然后断开连接,一个有点低效;因为我们使用的是保存的session,我相信(未验证)由于没有对 R 函数进行矢量化而几乎没有效率损失......尽管它仍然是 真的很容易对其进行矢量化。)

    【讨论】:

    • 在从我的服务器定位文件方面,我应该在后面放什么:out
    • 你读过我的例子吗?它展示了一种(多种)可能性。您需要知道它们所在的目录,除非您真的想下载整个远程服务器的文件系统列表(我确实推荐)。
    • 如果“我的主目录”的 ~ 简写在您的 ssh 连接中有效,您也许可以使用 "find ~ -type f -iname '*.png' -o -iname '*.jpg' 之类的东西。
    • 是否可以自动从服务器获取数据并立即将其上传到网站?因为我确实希望服务器上的所有数据(最终)都显示在网站上!
    • "find / -type f" 将返回所有文件。不过,正因为如此,您最好先下载一个压缩的 tarball,然后上传那个文件,然后再上传 ssh_exec_wait(sess, "tar xzf myfile.tar.gz")。如果您不熟悉tarfind 或其他shell 命令,那么这可能不是您执行此操作的最佳方式。坦率地说,我认为 R 在这里没有任何价值,我认为rsync(shell 命令)会更好/更有效。 ...但你需要知道 shell 命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2016-07-09
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多