You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何download.file下载Dropbox公开文件损坏,替代方法却可行?

为什么download.file下载Dropbox Excel文件失败,而二进制读写方法成功?

核心原因很简单:download.file()默认的传输模式不适合二进制文件,而你第二种方法用了正确的二进制读写方式

让我拆解一下细节:

第一种方法失败的根源

当你调用download.file(url, destfile = saveas)时,没有指定mode参数——在Windows系统中,这个参数默认是mode="w"(文本传输模式)。

文本模式是为纯文本文件设计的,它会自动转换换行符(比如把Unix风格的\n转换成Windows的\r\n),但Excel的.xlsx本质是一个压缩的二进制文件,字节结构非常严格。这种自动转换会破坏文件的原始字节序列,导致read_excel无法识别这个损坏的文件,抛出error reading from the connection错误。

你尝试添加&raw=1到URL里没用,因为问题出在本地的文件写入模式,不是Dropbox的链接本身。

第二种方法成功的原因

你的第二种方法完全绕开了文本模式的问题:

  • url(excelUrl, open="rb")明确以二进制读取模式打开连接,readBin直接读取文件的原始字节数据,不会做任何自动转换。
  • writeBin再把这些原始字节原封不动地写入本地文件,完美保留了Excel文件的原始结构,自然能被read_excel正常读取。

修复第一种方法的简单方案

其实不用换方法,只要给download.file加上mode="wb"(二进制写入模式)参数就行,这样就能正确下载二进制文件了:

library("readxl")

read_url_excel <- function(url,saveas = paste0(getwd(),"/newExcelFile.xlsx")){
 download.file(url, destfile = saveas, mode="wb")  # 关键:添加mode="wb"
 url_excel <- readxl::read_excel(saveas)
 return(url_excel)
}

# 现在可以正常运行了
excelUrl = "https://www.dropbox.com/s/v9lm9y7nso8yw1x/dashboardTotals.xlsx?dl=1"
excelTable = read_url_excel(excelUrl)

补充一句:在Mac/Linux这类类Unix系统中,文本和二进制模式的差异很小,默认可能不会出问题,但为了跨平台兼容性,下载任何非文本文件(比如Excel、图片、压缩包)时,都建议显式指定mode="wb"

内容的提问来源于stack exchange,提问作者Captain Hat

火山引擎 最新活动