Search code examples
rapixlsxrestrserve

XLSX data upload with RestRserve


I would like to work with RestRServe to have a .xlsx file uploaded for processing. I have tried the below using a .csv with success, but some slight modifications for .xlsx with get_file was not fruitful.

ps <- r_bg(function(){

  library(RestRserve)
  library(readr)
  library(xlsx)

  app = Application$new(content_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  app$add_post(
    path = "/echo",
    FUN = function(request, response) {
      cnt <- request$get_file("xls")
      dt <- xlsx::read.xlsx(cnt, sheetIndex = 1, header = TRUE)
      response$set_body("some function")
    }
  )

  backend = BackendRserve$new()
  backend$start(app, http_port = 65080)
})

Solution

  • What have you tried? According to the documentation request$get_file() method returns a raw vector - a binary representation of the file. I'm not aware of R packages/functions which allow to read xls/xlsx file directly from the raw vector (probably such functions exist, I just don't know).

    Here you can write body to a file and then read it normal way then:

    library(RestRserve)
    library(readxl)
    
    app = Application$new()
    app$add_post(
      path = "/xls",
      FUN = function(request, response) {
        fl = tempfile(fileext = '.xlsx')
        xls = request$get_file("xls")
    
        # need to drop attributes as writeBin() 
        # can't write object with attributes
        attributes(xls) = NULL
        writeBin(xls, fl)
        xls = readxl::read_excel(fl, sheet = 1)
        response$set_body("done")
      }
    )
    
    backend = BackendRserve$new()
    backend$start(app, http_port = 65080)
    

    Also mind that content_type argument is for response encoding, not for request decoding.