У меня возникают трудности, выяснить, что вызывает странные символы появляются в моем выходном потоке ... Полный код вывода @pastebinC#/BinaryWriter: Странные персонажи apprearing в выходном потоке
Скрипач
обратите внимание на «s
», «X
», «�
» перед моей границей?
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
мой код
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();
}
UPDATE
Я заметил, что если я сделал что-то вроде ниже вместо этого, используя комбинацию потока & Binary писателей, я могу избежать этой проблемы , Почему это так?
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();
Любая причина, по которой вы не используете WebClient, но HttpWebRequest? – dtb
WebClient.UploadFile делает multipart/form-data, но допускает только один файл за раз и не поддерживает дополнительные поля одновременно. Но вы можете самостоятельно создать полезную нагрузку, а затем установить правильный тип контента и использовать WebClient.UploadData или WebClient.UploadString. WebClient поддерживает неблокирующие операции в форме его методов XxxAsync. Это гораздо удобнее, чем HttpWebRequest. – dtb