Learn R Programming

RCurl (version 1.98-1.16)

getBinaryURL: Download binary content

Description

This function allows one to download binary content. This is a convenience function that is a call to getURL with suitable values for the write and file options for the Curl handle. These take care of processing the body of the response to the Curl request into a vector of "raw" elements.

Binary content from POST forms or other requests that are not simple URL requests can be implemented using the same approach as this function, i.e., specifying the same values as in the body of this function for write and file in the call to curlPerform.

Usage

getBinaryURL(url, ..., .opts = list(), curl = getCurlHandle(),
             .buf = binaryBuffer(.len), .len = 5000)

Value

A "raw" vector.

Arguments

url

the URL identifying the content to download. This can be a regular URL or a application/x-www-form-urlencoded URL, i.e. with name=value parameters appended to the location via a ?, and separated from each other via a &.

...

additional arguments that are passed to getURL.

.opts

a list of named values that are passed to getURL as the .opts argument.

curl

an optional curl handle used in curlPerform that has been created previously and is to be reused for this request. This allows the R user to reuse a curl handle that already has a connection to the server or has settings for options that have been set previously.

.buf

a raw vector in which to insert the body of the response. This is a parameter to allow the caller to reuse an existing buffer.

.len

an non-negative integer which is used as the length for the buffer in which to store the binary data in the response. The buffer is extended if it is not big enough but this allows the caller to provide context specific knowledge about the length of the response, e.g. the size of the file being downloaded, and avoid expanding the buffer as the material is being processed.

Author

Duncan Temple Lang

See Also

Examples

Run this code
  u = "https://www.omegahat.net/RCurl/data.gz"

if(url.exists(u)) withAutoprint({

  content = getBinaryURL(u)

  if (getRversion() >= "4") withAutoprint({
    x <- memDecompress(content, asChar = TRUE)
    read.csv(textConnection(x))
  }) else withAutoprint({
     tmp = tempfile()
     writeBin(content, con = tmp)
     read.csv(gzfile(tmp))
     unlink(tmp)
  })


   # Working from the Content-Type in the header of the HTTP response.
  h  = basicTextGatherer()
  content = getBinaryURL(u, .opts = list(headerfunction = h$update))
  header = parseHTTPHeader(h$value())
  type = strsplit(header["Content-Type"], "/")[[1]]

  if(type[2] %in% c("x-gzip", "gzip")) {
  if (getRversion() >= "4") {
     cat(memDecompress(content, asChar = TRUE))
  } else {
    tmp = tempfile()
    writeBin(content, con = tmp)
    writeLines(readLines(gzfile(tmp)))
    unlink(tmp)
    }
  }

})

Run the code above in your browser using DataLab