2016-07-24 114 views
1

我曾尝试上传使用API​​的UploadAsync()这里提到的PDF文件 https://www.dropbox.com/developers/documentation/dotnet#tutorialASP.NET的Dropbox API上传.pdf文件

文件被上传,但它被损坏而无法打开,我读取使用

System.IO.File.ReadAllText(fileUri); 

PDF文件的内容,然后通过这个等待函数返回一个共享链接到文件上的Dropbox上传的文件:

public static async Task<string> UploadFile(string folder, string fileName, string content) 
    { 
     using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content))) 
     { 
      FileMetadata updated = await dbx.Files.UploadAsync(
      folder + "/" + fileName, 
      WriteMode.Overwrite.Instance, 
      body: mem); 

      var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName); 
      var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1); 
      return share.Url; 
     } 
    } 

我想到它与编码有关,因为上传的文件包含的字符不是原来的,而是我找不到正确的编码,或者如果有更好的方法?

在此先感谢。

回答

2

System.IO.File.ReadAllText(fileUri)读取文件的字节并将它们转换为字符串。然后使用Encoding.UTF8将字符串写回来可能会更改内容。

请跳过此转换并直接使用字节。例如。

var content = System.IO.File.ReadAllBytes(fileUri); 

并将功能从string content更改为byte[] content

public static async Task<string> UploadFile(string folder, string fileName, byte[] content) 
{ 
    using (var mem = new MemoryStream(content)) 
    { 
     FileMetadata updated = await dbx.Files.UploadAsync(
     folder + "/" + fileName, 
     WriteMode.Overwrite.Instance, 
     body: mem); 

     var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName); 
     var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1); 
     return share.Url; 
    } 
} 

该解决方案仍然会将整个文件内容复制到内存中。直接从文件中读取内存消耗更有效。

public static async Task<string> UploadFile(string folder, string fileName, string fileUri) 
{ 
    using (var mem = new FileStream(fileUri, FileMode.Open, FileAccess.Read)) 
    { 
     FileMetadata updated = await dbx.Files.UploadAsync(
     folder + "/" + fileName, 
     WriteMode.Overwrite.Instance, 
     body: mem); 

     var arg1 = new Dropbox.Api.Sharing.CreateSharedLinkWithSettingsArg(folder + "/" + fileName); 
     var share = await dbx.Sharing.CreateSharedLinkWithSettingsAsync(arg1); 
     return share.Url; 
    } 
} 
+0

我们用另一种方法来实现这个任务,但是谢谢你的回答,我没有测试它。 –