You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确实现Plumber接口接收.rds文件与文件名并消除解析报错?

解决Plumber端点接收RDS文件与字符串参数的报错问题并支持Swagger

问题根源

你之前的代码同时声明了多个parser(@parser multi/rds/text/none),导致Plumber的解析逻辑冲突;另外手动调用mime::parse_multipart(req)绕过了Plumber自带的解析流程,最终触发了"No suitable parser found"报错——虽然功能能跑,但解析环节的异常没被处理。

正确实现方案

只保留@parser multi即可(multipart/form-data请求仅需这个parser就能同时处理文件和文本参数),同时添加Swagger兼容的注释,让Plumber自动处理参数解析,消除报错。

修改后的Plumber代码(plumber.R)

library(plumber)

#* 上传RDS文件并指定保存路径
#* @post /write_rds
#* @parser multi
#* @param rds_file file: 待上传的RDS文件
#* @param file_path character: 文件保存路径(例如"test.rds")
function(rds_file, file_path) {
  # 读取上传的RDS文件内容
  rds_data <- readRDS(rds_file$datapath)
  
  # 保存为RDS格式(用saveRDS比save更规范,对应readRDS的读写逻辑)
  saveRDS(rds_data, file = file_path)
  
  # 返回成功响应
  list(status = "success", saved_file_path = file_path)
}

测试请求代码

library(magrittr)
library(httr)

# 生成测试用RDS文件
tmpfile <- tempfile(fileext = ".rds")
saveRDS(iris, file = tmpfile)

# 发起POST请求
res <- POST(
  "http://127.0.0.1:8966/write_rds",
  body = list(
    rds_file = upload_file(tmpfile), # 无需手动指定MIME类型,multi parser自动识别
    file_path = "test.rds"
  ),
  encode = "multipart"
) %>% content()

print(res)

Swagger支持

启动Plumber服务后,直接访问http://127.0.0.1:8966/__docs__/就能看到自动生成的Swagger文档,可直接在界面上上传文件、输入保存路径进行接口测试。

内容的提问来源于stack exchange,提问作者Michael Bird

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:44:55