2017-03-07 4 views
1

Ich versuche Binärdaten (eine Excel XLS-Datei) in Daten zu konvertieren, die ich als Teil einer HTTP-Multi-Teil-Anfrage übergeben kann (der Code zum Generieren der Multi-Teil Anfragen arbeitet seit einiger Zeit mit String-Daten, so denke ich, ist es die Codierung der binären Daten, die das Problem ist, nicht wie die Anfrage gebildet wird).Konvertieren von binären (Excel) Daten in String für HTTP-Anfrage

Für ref die ersten sieben Zeichen der Excel-Datei (wenn Ansicht in Notepad ++) sind:

decimal hex 
Ð 208  D0 
Ï 207  CF 
    17  11 
à 224  E0 
¡ 161  A1 
± 177  B1 
    26  1A 

Ich gründe element.BinaryContent

binaryContent = System.IO.File.ReadAllBytes(filePath); 

mit der Wenn ich dann

content.Append(Encoding.UTF8.GetString(element.BinaryContent)); 
verwenden

, um den HTTP-Anforderungsinhalt zu erstellen, der dies gibt (aus dem Direktfenster in VS):

binary content converted to UTF8

In der hochgeladenen Datei die Steuer Zeichen und die englischen Zeichen korrekt beibehalten, aber andere Zeichen werden falsche Werte umgewandelt.

Wenn ich das nicht gut erkläre, zeigt das Bild unten links die Daten und rechts das Original.

Comparison of files: before and after upload

Für ref, wie ich die Anfrage machen, ist mit diesem:

protected static void SetRequestContent(string requestContent, HttpWebRequest request, string contentType) 
    { 
     request.ContentType = contentType; 

     byte[] byteData = UTF8Encoding.UTF8.GetBytes(requestContent); 

     using (Stream postStream = request.GetRequestStream()) 
     { 
      postStream.Write(byteData, 0, byteData.Length); 
     } 
    } 

wo requestContent korrekt gebildet hat Inhalt mehrteiligen, wie folgt aus:

--------------------------BNDY 
Content-Disposition: form-data; name=password 
Txxxxx 
--------------------------BNDY 
Content-Disposition: form-data; name=username 
[email protected] 
--------------------------BNDY 
Content-Disposition: form-data;name=\"FILE\";filename=\"c:/POSTOutput/Upload.xls\" 
��\u0011\u0871\u001a�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>\0\u0003\0��\t\0\u0006\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\u0010\0\0\u0002\0\0\0\u0001\0\0\0����\0\0\0\0\0\0\0\0������������ (etc). 

Was muss ich tun, um die Daten im Originalformat zu übertragen?

+0

AFAIK, werden mehrteilige chunks normalerweise mit Base64-kodiert – dlatikay

Antwort

0

Ihre Codelinie

content.Append(Encoding.UTF8.GetString(element.BinaryContent)); 

geht davon aus, dass beliebige Bytefolgen (aus einer Binärdatei ohne inhärente Zeichencodierung) immer in einer Unicode-Zeichenkette umgewandelt werden. Dies ist nicht der Fall: documentation - undefinierte Codepunkte können zu Ersetzungen führen (Fallback) oder sogar eine ArgumentException verursachen.

Wenn Sie einen String haben muss, eine robuste Codierung wie base64 anstatt:

content.Append(Convert.ToBase64String(element.BianryContent)); 

Noch besser: Geben Sie den MIME-Typ mit dem type Attribut des subpart (application/vnd.ms-Excel für xls , anders für xlsx), so dass Sie überhaupt nicht codieren müssen und die rohe Bytesequenz direkt an den Stream senden müssen.

Referenzen:
- Using HttpWebRequest to POST data/upload image using multipart/form-data

Verwandte Themen