C#/BinaryWriter:输出流中出现的奇怪字符

C#/BinaryWriter:输出流中出现的奇怪字符,c#,httpwebrequest,C#,Httpwebrequest,我很难找出是什么导致wierd字符出现在我的输出流中。。。完整代码 小提琴手输出 请注意“s”、“X”、“�“在我的边界之前 s---------------634227387532666996 Content-Disposition: form-data; name='key' c06f4d0cdf6f2cc652635a08be34973d X---------------634227387532666996 Content-Disposition: form-data; name='ty

我很难找出是什么导致wierd字符出现在我的输出流中。。。完整代码

小提琴手输出

请注意“
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();
}
更新

我注意到,如果使用流和二进制编写器的组合,我可以避免这个问题。为什么会这样

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();

BinaryWriter将字符串的长度作为前缀


请改用StreamWriter。

BinaryWriter将字符串的长度作为前缀


改用StreamWriter。

您不使用WebClient而使用HttpWebRequest的任何原因?WebClient.UploadFile不支持多部分/表单数据,但一次只允许一个文件,不支持同时使用其他字段。但是您可以自己构建负载,然后设置正确的内容类型并使用WebClient.UploadData或WebClient.UploadString。WebClient以其XxxAsync方法的形式支持非阻塞操作。它比HttpWebRequest方便得多。您为什么不使用WebClient而使用HttpWebRequest?WebClient.UploadFile不支持多部分/表单数据,但一次只允许一个文件,并且不支持同时使用其他字段。但是您可以自己构建负载,然后设置正确的内容类型并使用WebClient.UploadData或WebClient.UploadString。WebClient以其XxxAsync方法的形式支持非阻塞操作。它比HttpWebRequest方便得多。哦,那么我也可以使用
StreamWriter
来编写
byte[]
?查看
文件.ReadAllBytes(filepath)
部分,这是我后来发现
StreamWriter
can时使用
BinaryWriter
的唯一原因;t写入
字节[]
对不起,我没有注意到字节[]。在这种情况下,您需要使用UTF8Encoding将字符串转换为字节[],并将字节[]直接写入流中。或者,您可以(甚至可能需要?)将文件内容编码为Base64。结果是一个字符串。看看如果我不需要转换成base64怎么办?我怎么用一个普通的
StreamWriter
来写
byte[]
顺便问一下,如果我用base64编码,我的图像会是
image/png
还是别的?我想我的请求在fiddler中被标记为红色,这意味着请求头等有问题。哦,那么我可以使用
StreamWriter
也写入
byte[]
吗?查看
文件.ReadAllBytes(filepath)
部分,这是我后来发现
StreamWriter
can时使用
BinaryWriter
的唯一原因;t写入
字节[]
对不起,我没有注意到字节[]。在这种情况下,您需要使用UTF8Encoding将字符串转换为字节[],并将字节[]直接写入流中。或者,您可以(甚至可能需要?)将文件内容编码为Base64。结果是一个字符串。看看如果我不需要转换成base64怎么办?我怎么用一个普通的
StreamWriter
来写
byte[]
顺便问一下,如果我用base64编码,我的图像会是
image/png
还是别的?我认为我的请求在fiddler中被标记为红色,这意味着请求头有问题等。