在 R 中上传超过 2.15 GB 的文件

Posted

技术标签:

【中文标题】在 R 中上传超过 2.15 GB 的文件【英文标题】:Upload a file over 2.15 GB in R 【发布时间】:2015-06-30 20:38:04 【问题描述】:

我有一个手动过程,我通过 curl 将 5-6 GB 文件上传到网络服务器:

curl -X POST --data-binary @myfile.csv http://myserver::port/path/to/api

这个过程运行良好,但我很想使用 R 自动化它。问题是,我要么不知道我在做什么,要么 curl 的 R 库不知道如何处理更大的文件超过~2GB:

library(RCurl)
postForm(
     "http://myserver::port/path/to/api",
      file = fileUpload(
        filename = path.expand("myfile.csv"),
        contentType = "text/csv"
      ),.encoding="utf-8")

产量Error: Internal Server Error

httr 也不起作用:

library(httr)
POST(
      url = "http://myserver:port/path/to/api",
      body = upload_file(
        path =  path.expand("myfile.csv"),
        type = 'text/csv'),
      verbose()
    )

产量:

Response [http://myserver:port/path/to/api]
  Date: 2015-06-30 11:11
  Status: 400
  Content-Type: <unknown>
<EMPTY BODY>

httr 使用 verbose() 选项可以提供更多信息,告诉我:

-> POST http://myserver:port/path/to/api
-> User-Agent: libcurl/7.35.0 r-curl/0.9 httr/1.0.0
-> Host: http://myserver::port
-> Accept-Encoding: gzip, deflate
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: text/csv
-> Content-Length: -2147483648
-> Expect: 100-continue
-> 
<- HTTP/1.1 400 Bad Request
<- Server: Apache-Coyote/1.1
<- Transfer-Encoding: chunked
<- Date: Tue, 30 Jun 2015 11:11:11 GMT
<- Connection: close
<- 

Content-Length: -2147483648 看起来有点像 32 位整数溢出,所以我认为这是 httr 中的错误。我怀疑 RCurl 遇到了类似的故障。

我真的很喜欢 curl -X POST --data-binary 的最小包装器,但除此之外,我有哪些选择可以从 R 上传相当大的文件?

【问题讨论】:

我假设您使用的是最新版本的 httr,它使用的是 curl R 包。如果您无法直接使用 Jeroen 的包(绕过 httr)使其工作,那么在 github 上创建问题可能会更快。 @joran 是的,我正在使用 httr,这取决于 curl。我提出了一个 github 问题,但与此同时,我很想知道是否有人每次都从 R 上传一个 2.2GB 以上的文件到网络服务。我不能成为历史上第一个尝试这样做的人...... 在此期间,您可能可以使用system 直接调用curl。 @tonytonov 好主意,我现在就试试。 @costebk08 我不认为 RevoScaleR 包含 curl 的替代品。 【参考方案1】:

此错误已在 httr/curl 的 dev 版本中修复:

devtools::install_github("jeroenooms/curl")
devtools::install_github("hadley/httr")

这是 R 的 httr 和 curl 软件包中的一个错误。截至 2015 年 7 月 2 日,该错误为 fixed on GitHub,并且该更改将很快推广到 CRAN。

也有可能我在上述命令中错误地调用了 RCurl,但我永远无法找出正确的调用。

【讨论】:

如果你真的复制粘贴了上面的命令,你输错了uft-8,它的utf-8 @zerweck 好收获!我认为您可以使用我帖子下方的(edit) 按钮提出修改建议,然后我可以对其进行审核。

以上是关于在 R 中上传超过 2.15 GB 的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将超过 2Gb 的文件上传到 IIS 7.5 / .Net 4?

PHP AWS Elastic Beanstalk - 不能发布超过 2GB 的文件

如何在 ASP.NET C# 中上传 10GB+ 大小的文件

使用 jQuery File Upload 上传超过 1GB 到 2GB 的大文件 - blueimp(基于 Ajax)php / yii 它在 Firefox 浏览器中显示错误

上传多个文件时上传进度

Web.config 设置无法接受超过 1 GB 的文件大小