2016-07-24 23 views
1

Ich habe versucht, eine PDF-Datei Hochladen der UploadAsync API() verwendet hier erwähnt: https://www.dropbox.com/developers/documentation/dotnet#tutorialASP.NET Dropbox API-Upload PDF-Dateien

die Datei hochgeladen wird, aber es wird beschädigt und kann nicht geöffnet werden kann, ich lesen Sie den Inhalt der pDF-Datei

System.IO.File.ReadAllText(fileUri); 

mit und laden Sie dann die Datei über warten auf diese Funktion, die einen gemeinsam nutzbaren Link zur Datei auf Dropbox zurückzugibt:

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; 
     } 
    } 

Ich fand heraus, dass es mit der Kodierung zusammenhing, da die hochgeladene Datei andere Zeichen als das Original enthielt, aber ich konnte die richtige Kodierung nicht finden, oder wenn es eine bessere Herangehensweise gibt?

Vielen Dank im Voraus.

Antwort

2

Die System.IO.File.ReadAllText(fileUri) liest die Bytes der Dateien und konvertiert sie in eine Zeichenfolge. Wenn Sie dann die Zeichenfolge mit Encoding.UTF8 zurückschreiben, ändert sich möglicherweise der Inhalt.

Bitte überspringen Sie diese Umwandlung und verwenden Sie die Bytes direkt. Z.B.

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

und ändern Sie die Funktion 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; 
    } 
} 

Diese Lösung wird weiterhin den gesamten Dateiinhalt in den Speicher kopieren. In Bezug auf den Speicherverbrauch ist es effizienter, direkt aus der Datei zu lesen.

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

Wir benutzten einen anderen Weg, um die Aufgabe zu erfüllen, aber danke für Ihre Antwort, ich habe es aber nicht getestet. –