【问题标题】:How to transfer a PDF file using the Plumber API?如何使用 Plumber API 传输 PDF 文件?
【发布时间】:2021-06-29 19:23:34
【问题描述】:

我有一个 API 函数,它接受输入,使用该输入获取必要的数据,调用 .rmd 文件,并使用该 .rmd 文件在指定目录中生成一个 pdf 文件。 我需要 API 的剩余部分来获取新生成的 pdf 文件并通过 HTTP 发布它。但是,每当我尝试这样做时,我最终都会得到一个损坏的文件作为输出。

这是我当前的代码:

#* @serializer contentType list(type="application/pdf")
#* parameter_selection
#* @param a1
#* @get /pdf

function( a1) {
  
  #Please assume that the filename location is correct. 

  filename = paste0( a1, '_','report','.pdf', sepp='')

  locale_filename = paste0('notebooks/',filename, sepp= '')

  readBin(locale_filename, "raw", n=file.info(locale_filename)$size)


}

谢谢。

【问题讨论】:

  • 仅供参考,sepp='' 被忽略,因为它不匹配任何参数但什么也不添加;如果您的意思是sep='',则在使用paste0 时不需要。事实上,如果您尝试paste0('a','b',sep=' '),您会发现它无法将其识别为参数,因此它会添加文字单字符字符串,如ab (那里有一个空格)。
  • 您的代码非常模仿rplumber.io/articles/rendering-output.html,当我使用它时(在 R-4.0.5 的 FF 中),它可以工作。您确定可以在您的管道工环境之外(之前,而不是通过)查看该文件吗?
  • r2evans 首先是正确的。那么你的代码中有这个吗? ` res$setHeader("Content-Disposition", paste0("attachment; filename=", basename(locale_filename)))` 在您的浏览器中链接和公开pdf文件?对我来说,这段代码有效。管道工要考虑的另一件事是使用完整路径而不是相对路径来访问文件,它始终可以工作,而相对路径则取决于它。
  • 是的。该文件在其指定的文件夹中呈现没有问题,但是当我尝试通过 AP 接口推送该文件时,我收到此错误:响应正文无法识别的响应类型;将内容显示为文本。我在正文响应中得到了一些看起来像 pdf 文件的东西,但是当我尝试使用 pdf 查看器打开它时,我得到一个损坏的文件错误。我得到的响应标头是:内容长度:1050292 内容类型:应用程序/pdf 日期:Tue29 Jun 2021 19:46:37 GMT
  • 我应该在代码中的哪个位置放置一行: res$setHeader("Content-Disposition", paste0("attachment; filename=", basename(locale_filename))) ?

标签: r api pdf serialization plumber


【解决方案1】:

是这样的:

#* @serializer contentType list(type="application/pdf")
#* parameter_selection
#* @param a1
#* @get /pdf

function( a1, res) {

  #Please assume that the filename location is correct. 

  filename = paste0( a1, '_','report','.pdf', sepp='')

  locale_filename = paste0('notebooks/',filename, sepp= '')

  tmp <- tempfile()

  res$setHeader("Content-Disposition", paste0("attachment; filename=", basename(locale_filename)))

  tmp <- rmarkdown::render(file_location ,output_file = paste0(this_title, sepp=''), envir = new.env(parent = globalenv()))


  readBin(locale_filename, "raw", n=file.info(locale_filename)$size)

}

【讨论】:

    猜你喜欢
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2021-11-06
    • 1970-01-01
    相关资源
    最近更新 更多