2016-07-24 3 views
1

나는 여기에 언급 된 API의 UploadAsync()를 사용하여 PDF 파일을 업로드 시도 : https://www.dropbox.com/developers/documentation/dotnet#tutorialASP.NET 보관 용 API 업로드 된 .pdf 파일

파일이 업로드됩니다 있지만 손상된 및 열 수 없습니다, I

System.IO.File.ReadAllText(fileUri); 

를 사용하여 PDF 파일의 내용을 읽은 다음 드롭 박스의 파일을 공유 할 수있는 링크 반환이 기능 기다리고 통해 파일을 업로드 :

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

작업을 수행하는 또 다른 방법을 사용했지만 답변을 주셔서 감사합니다. –