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();
Une raison pour laquelle vous n'utilisez pas WebClient mais HttpWebRequest? – dtb
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