为何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




