对大文件使用 httr + graph API

Using httr + graph API for large files

我正在尝试使用 Microsoft Graph API 通过 R 直接将大文件上传到 SharePoint Online。为此,我正在使用 API 的 createUploadSession、文档 here

我的代码如下所示:

httr::PUT(url = "https://graph.microsoft.com/v1.0/sites/.../createUploadSession", 
          headers   = add_headers(.headers = headers), 
          body      = httr::upload_file(file),
          encode    = mime::guess_type(file), 
          verbose())

(其中 'headers' 包括身份验证和主机名,此处 graph.microsoft.com

结果请求如下所示:

-> PUT /v1.0/sites/.../createUploadSession HTTP/1.1
-> Host: graph.microsoft.com
-> User-Agent: libcurl/7.64.1 r-curl/4.3 httr/1.4.2
-> Accept-Encoding: deflate, gzip
-> Accept: application/json, text/xml, application/xml, */*
-> Content-Type: text/plain
-> Content-Length: 4543954542

当然,这失败了:

<- HTTP/1.1 413 Request Entity Too Large
<- Content-Type: text/html
<- Server: Microsoft-IIS/10.0
<- Strict-Transport-Security: max-age=31536000
<- Date: Fri, 02 Oct 2020 12:32:29 GMT
<- Connection: close
<- Content-Length: 67
<- 

因为如文档所述,我们需要上传 327,680 字节的块。但是,我假设 httrupload_file 允许流式传输。这就是我卡住的地方:看起来我的请求仍在尝试一次上传所有内容,那么我如何 'invoke' 这种流式传输行为?是否需要某种 while 循环才能继续发送下一个数据块?

此功能现已在 Microsoft365R 包中提供。完全披露:我是这个包的作者。

site <- get_sharepoint_site("sitename")
site$get_drive()$upload_file("path/to/file", "destfilename")