2010-10-15 4 views
0

У меня возникают трудности, выяснить, что вызывает странные символы появляются в моем выходном потоке ... Полный код вывода @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(); 
+0

Любая причина, по которой вы не используете WebClient, но HttpWebRequest? – dtb

+1

WebClient.UploadFile делает multipart/form-data, но допускает только один файл за раз и не поддерживает дополнительные поля одновременно. Но вы можете самостоятельно создать полезную нагрузку, а затем установить правильный тип контента и использовать WebClient.UploadData или WebClient.UploadString. WebClient поддерживает неблокирующие операции в форме его методов XxxAsync. Это гораздо удобнее, чем HttpWebRequest. – dtb

ответ

5

BinaryWriter префиксные строки с их длиной.

Вместо этого используйте StreamWriter.

+0

О, тогда я могу использовать 'StreamWriter' для записи' byte [] 'тоже? Посмотрите на 'File.ReadAllBytes (путь к файлу)', это единственная причина, по которой я позже использовал BinaryWriter, когда обнаружил 'StreamWriter', t написал' byte [] ' –

+0

Извините, я не заметил байта []. В этом случае вам нужно преобразовать строки в байт [] с использованием кодировки UTF8Encoding и записать байт [] непосредственно в поток. – dtb

+0

В качестве альтернативы вы можете (или, может быть, даже нужно?) Кодировать содержимое файла как Base64. Результатом является строка. См. Http://stackoverflow.com/questions/1853803/is-there-a-popular-c-library-for-working-http-eg-simplifing-working-with-httpwe/1853909#1853909 – dtb

Смежные вопросы