使用Dropbox .NET SDK上传文件未完成,文件大小远小于预期
Dropbox .NET SDK 上传文件不完整问题解决
看起来你遇到的问题是上传的文件只有几十字节,完全不符合预期的3-5MB大小,我来帮你排查下问题并给出修正方案:
问题根源分析
先看你写的上传函数:
async Task Upload(DropboxClient dbx, string folder, string file, string content) { using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content))) { var updated = await dbx.Files.UploadAsync( folder + "/" + file, WriteMode.Overwrite.Instance, body: mem); //Console.WriteLine("Saved {0}/{1} rev {2}", folder, file, updated.Rev); } }
这个函数的核心逻辑是将传入的content字符串编码成UTF-8字节流上传,这会导致几个关键问题:
- 如果你误将文件路径当成
content传入,那上传的只是路径字符串的字节,自然只有几十字节 - 即使你传入了文件内容,3-5MB的文件转成字符串存储本身就非常低效,甚至可能因为编码或内存限制导致内容截断
- 另外你提到调用时用了
Task.Run,如果没有正确等待任务完成(比如没加await),程序可能在上传结束前就关闭了流,也会导致文件上传不完整
修正后的上传方案
针对上传本地大文件的场景,更合理的做法是直接读取文件流上传,避免字符串中转。这里给你调整后的代码:
修正后的上传函数
async Task UploadFileToDropbox(DropboxClient dbx, string targetFolder, string remoteFileName, string localFilePath) { // 直接用FileStream读取本地文件,无需转成字符串 using (var fileStream = new FileStream(localFilePath, FileMode.Open, FileAccess.Read)) { // 用Path.Combine拼接路径更安全,避免手动拼接的斜杠问题 var uploadResult = await dbx.Files.UploadAsync( Path.Combine(targetFolder, remoteFileName), WriteMode.Overwrite.Instance, body: fileStream); // Console.WriteLine("上传完成:{0}/{1},版本号:{2}", targetFolder, remoteFileName, uploadResult.Rev); } }
正确的调用方式
调用时记得传入本地文件的完整路径,并且一定要等待异步任务完成:
// 示例调用,替换成你的实际参数 var uploadTask = UploadFileToDropbox( dbx, "/我的Dropbox文件夹", "要保存的文件名.pdf", @"C:\本地文件存储路径\源文件.pdf"); // 等待上传完成,避免任务未结束就终止 await uploadTask;
额外注意事项
- 确保程序有读取本地文件的权限,否则会抛出权限异常
- 如果确实需要上传字符串内容(比如短文本),要确保
content是完整的目标内容,且编码匹配;但大文件绝对不推荐这种方式 - 避免用
Task.Run包裹异步方法后不等待,这会导致任务在后台运行,一旦主程序退出,上传会被强制终止
内容的提问来源于stack exchange,提问作者Niel
相关产品推荐
相关产品推荐

