2016-05-27 14 views
0

Wir versuchen, Microsoft Excel-Datei auf OneDrive hochzuladen, aber die Datei wird jedes Mal beschädigt, wenn wir dies tun.Datei Korruption beim Hochladen von Excel-Dateien in Microsoft Graph API Beta

Wir haben versucht mit [diese Anweisungen] eine PUT Anfrage auf die folgenden Permutationen von Einstellungen vornehmen:

Inhalt-Codierungen:

  • text/Plan
  • application/vnd.openxmlformats -officedocument.spreadsheetml.sheet

POST Körper:

  • XLSX-Datei-Bytes von der Festplatte
  • XLSX-Datei kodiert als UTF8-String
  • XLSX-Datei als Base64 codiert roh

Wenn wir die Datei herunterladen, die hochgeladen wird, es fast gleich aussieht, aber ein paar binäre Regionen sind anders. Wenn Sie sich beim Öffnen einer Excel-Datei aus dem Internet wohl fühlen, habe ich ein Beispiel für the file we upload und die corrupted file OneDrive saves hochgeladen.

Das hat den ganzen Geruch eines Fehlers, der mit einer einzigen Parametermodifikation behoben werden kann ... Ich kann einfach nicht herausfinden, was es ist.

Wer hat Gedanken? Vielen Dank!

Antwort

1

Dank @GSM. Hier ist unser Code in TypeScript.

var fileContent = FileSystem.readFileSync(localFile); 
var url = `https://graph.microsoft.com/beta/me/drive/root/children/${doc.name}.xlsx:/content`, 

var opts { 
    url: url, 
    method: 'PUT', 
    headers: [ 
    'Content-Type': 'text/plain', 
    'Authorization': token 
    ], 
    body: fileContent 
}; 
var requestOpts = { 
    url: `https://${domain}${opts.path}`, 
    method: opts.method, 
    headers: {}, 
}; 

request(opts, cb); 

Der einzige Unterschied, den ich sehe, ist, dass Sie einen alternativen Pfad verwenden, die Datei zu laden, die auch auf der GraphAPI Seite dokumentiert. Wenn wir den Weg, den Sie verwenden verwenden erhalten wir die zurück, um die Fehlermeldung zurück:

{ 
    "error": { 
    "code": "BadRequest", 
    "message": "Entity only allows writes with a JSON Content-Type header.", 
    "innerError": { 
     "request-id": "2a2e7588-3217-4337-bee3-f8aff208510c", 
     "date": "2016-05-30T16:35:50" 
    } 
    } 
} 

..welche seltsam ist, weil es macht mich erwarten, dass Ihr Code sollte auch nicht gearbeitet haben.

Update - die Antwort

Durch die Datei in einen String zu lesen und dann zu dem JSON-Objekt zu schreiben, die die PUT Parameter definiert, waren wir es korrumpieren. Wir haben das Problem gelöst, indem wir einfach einen Dateilese-Stream direkt an die offene HTTP-Anfrage weitergeleitet haben.

0

Es wäre einfacher zu helfen, wenn Sie Ihren Code gepostet haben. Hier ist jedoch ein Code, der zum Hochladen von Dateien in OneDrive verwendet werden kann. Ich testete es mit Ihrer Datei und war in der Lage, nur gut zu laden und herunterzuladen:

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.AccessToken); 

    var byteContent = File.ReadAllBytes(@"C:\Temp\sheet-uploaded.xlsx"); 
    var url = resource + "beta/me/drive/root:/Documents/sheet-uploaded.xlsx:/content"; 

    var result = client.PutAsync(url, new ByteArrayContent(byteContent)).Result; 
    result.Content.ReadAsStringAsync().Dump(); 
}