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

在R语言中用httr2通过POST上传文件,httr::upload_file的等价方法是什么?

在httr2中实现文件上传(替代httr::upload_file)

问题背景

需要用R语言的httr2包发送POST请求上传文件(以PNG为例),原httr包中使用upload_file()的示例代码如下:

library(httr)

media <- tempfile()
png(media, width = 800, height = 600)
plot(cars)
dev.off()

metadata <- tempfile()
writeLines(jsonlite::toJSON(list(title = jsonlite::unbox("My file"))), metadata)

# POST请求
req <- POST("https://httpbin.org/post",
  body = list(
    metadata = upload_file(metadata, type = "application/json; charset=UTF-8"),
    media = upload_file(media, type = "image/png")
  ),
  add_headers("Content-Type" = "multipart/related"),
  verbose()
)

unlink(media)
unlink(metadata)

但httr2官方文档中多是文本内容的示例,需要找到对应upload_file()的文件上传方法。

解决方案

在httr2中,**使用curl::form_file()配合req_body_multipart()**来实现文件上传,这是httr::upload_file()的等价替代方案。

转换后的httr2代码示例

library(httr2)
library(curl)
library(jsonlite)

# 生成待上传的PNG文件
media <- tempfile(fileext = ".png")
png(media, width = 800, height = 600)
plot(cars)
dev.off()

# 生成JSON元数据文件
metadata <- tempfile(fileext = ".json")
writeLines(toJSON(list(title = unbox("My file"))), metadata)

# 构建并发送POST请求
req <- request("https://httpbin.org/post") %>%
  req_body_multipart(
    metadata = form_file(metadata, type = "application/json; charset=UTF-8"),
    media = form_file(media, type = "image/png")
  ) %>%
  req_headers("Content-Type" = "multipart/related") %>%
  req_verbose() %>% # 可选,查看请求详情
  req_perform() # 执行请求

# 清理临时文件
unlink(media)
unlink(metadata)

关键说明

  • curl::form_file():负责指定要上传的文件路径和对应的MIME类型,功能完全对应httr::upload_file()
  • req_body_multipart():用于构建多部分表单请求体,替代httr中POST()函数的body参数列表
  • req_headers():设置请求头,对应httr的add_headers()
  • 如果只是想预览请求而不实际发送,可以用req_dry_run()替代req_perform()

内容的提问来源于stack exchange,提问作者Duccio A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:07:40