2010-10-15 4 views
0

J'ai des difficultés de trouver ce qui cause des personnages bizarres à apparaître dans mon flux de sortie ... code complet @pastebinC#/BinaryWriter: Insolites Caractères apprearing en flux de sortie

Fiddler sortie

remarquez le "s", "X", "" avant mes limites?

s---------------634227387532666996 
Content-Disposition: form-data; name='key' 

c06f4d0cdf6f2cc652635a08be34973d 
X---------------634227387532666996 
Content-Disposition: form-data; name='type' 

file 
�---------------634227387532666996 
Content-Disposition: form-data; name='image'; filename='application_osx_split.png' 
Content-Type=image/png 

�PNG 

mon code

var bound = "-------------" + DateTime.Now.Ticks.ToString(); 
var tmplField = "--" + bound + "\r\nContent-Disposition: form-data; name='{0}'\r\n\r\n{1}\r\n"; 
var tmplFile = "--" + bound + "\r\nContent-Disposition: form-data; name='{0}'; filename='{1}'\r\nContent-Type={2}\r\n\r\n"; 

.... 

using (var reqStream = req.GetRequestStream()) 
{ 
    var reqWriter = new BinaryWriter(reqStream); 

    reqWriter.Write(string.Format(tmplField, "key", "c06f4d0cdf6f2cc652635a08be34973d")); 
    reqWriter.Write(string.Format(tmplField, "type", "file")); 
    reqWriter.Write(string.Format(tmplFile, "image", Path.GetFileName(filepath), "image/" + Path.GetExtension(filepath).Substring(1))); 
    reqWriter.Write(File.ReadAllBytes(filepath)); 
    reqWriter.Write("\r\n--" + bound + "--"); 
    reqWriter.Flush(); 
} 

MISE À JOUR

J'ai remarqué que si je faisais quelque chose comme ci-dessous à la place, en utilisant une combinaison de flux & Writers binaire, je peux éviter le problème . Pourquoi cela est-il ainsi? BinaryWriter préfixe les chaînes avec leur longueur.

var reqWriter = new StreamWriter(reqStream); 
reqWriter.Write(string.Format(tmplField, "key", "c06f4d0cdf6f2cc652635a08be34973d")); 
reqWriter.Write(string.Format(tmplField, "type", "file")); 
reqWriter.Write(string.Format(tmplFile, "image", Path.GetFileName(filepath), "image/" + Path.GetExtension(filepath).Substring(1))); 
reqWriter.Flush(); 

var binWriter = new BinaryWriter(reqStream); 
binWriter.Write(File.ReadAllBytes(filepath)); 
binWriter.Write("\r\n--" + bound + "--"); 
binWriter.Flush(); 
+0

Une raison pour laquelle vous n'utilisez pas WebClient mais HttpWebRequest? – dtb

+1

WebClient.UploadFile effectue une opération multipart/form-data, mais n'autorise qu'un seul fichier à la fois et ne prend pas en charge les champs supplémentaires en même temps. Mais vous pouvez créer la charge utile vous-même, puis définir le bon type de contenu et utiliser WebClient.UploadData ou WebClient.UploadString. WebClient prend en charge les opérations non bloquantes sous la forme de ses méthodes XxxAsync. C'est beaucoup plus pratique que HttpWebRequest. – dtb

Répondre

5

Utilisez plutôt StreamWriter.

+0

Oh, alors puis-je utiliser un 'StreamWriter' pour écrire' byte [] 'aussi? Regardez la partie 'File.ReadAllBytes (filepath)', c'est la seule raison pour laquelle j'ai utilisé 'BinaryWriter' plus tard quand j'ai découvert que' StreamWriter' peut: t écrire 'byte []' –

+0

Désolé, je n'ai pas noté le byte []. Dans ce cas, vous devez convertir les chaînes en byte [] en utilisant UTF8Encoding et écrire le byte [] directement dans le flux. – dtb

+0

Alternativement, vous pouvez (ou peut-être même avoir besoin de?) Encoder le contenu du fichier en Base64. Le résultat est une chaîne. Voir http://stackoverflow.com/questions/1853803/is-there-a-popular-c-library-for-working-http-eg-simplifing-working-with-httpwe/1853909#1853909 – dtb

Questions connexes