在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
相关产品推荐
相关产品推荐

