写二进制文件

3

我正在读取来自一个使用http POST将图像传输到服务器的IPhone应用程序的数据,我可以将其读入二进制文件并写入文件(见下文),但问题在于当我打开图像时它会失败。

您可以在此帖子中查看Iphone上的代码: asp http POST Read Data

代码:

byte[] buffer = new byte[Request.ContentLength];
using (BinaryReader br = new BinaryReader(Request.InputStream))
    br.Read(buffer, 0, buffer.Length);

string fileName = @"C:\test\test.jpg";
FileStream fs = new FileStream(fileName, FileMode.Create, 
    FileAccess.ReadWrite);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(buffer);
bw.Close();

图片的 Content-Type 是 application/octet-stream。

请问有谁能解释一下这个吗?


你是在问什么是application/octet-stream,还是如何将其更改为不同的MIME类型? - Thomas Owens
另外,"失败"是什么意思? - Thomas Owens
当我说“放置失败”时,我的意思是图像无法打开,格式不正确。我在记事本中打开它,可以看到标题和内容。 - MartGriff
2个回答

3
也许Request.ContentLength没有正确设置?我深知不总是可以信任它,这是我的痛苦经历。:-(
您可以按如下方式在不预先知道长度的情况下读取流:
const int bufferSize = 1024 * 64; // pick any reasonable buffer size
List<byte> buffer = new List<byte>();
using(Stream stream = new BufferedStream(request.InputStream, bufferSize)) {
    int value;
    while((value = stream.ReadByte()) != -1) {
        buffer.Add((byte) value);
    }
}

1
以下代码可以正常工作吗?为此,最好将FileStream更改为MemoryStream。
fs.Position = 0;
Bitmap bit_map = Bitmap.FromStream(fs) as Bitmap;
bit_map.Save(@"C:\test\test.jpg");

或者

fs.Position = 0;
Image image = Image.FromStream(fs); 
image.Save(@"C:\test\test.jpg", ImageFormat.Jpeg);

完整示例(使用您的示例,但如果您想更改从其他帖子中读取二进制数据的方式,也可以,只需从缓冲区后继续):

byte[] buffer = new byte[Request.ContentLength];
using (BinaryReader br = new BinaryReader(Request.InputStream))
    br.Read(buffer, 0, buffer.Length);
MemoryStream mem_stream = new MemoryStream (buffer); 
mem_stream.Write(buffer, 0, buffer.Length); 
mem_stream.Position = 0;
Image image = Image.FromStream(mem_stream); 
image.Save(@"C:\test\test.jpg", ImageFormat.Jpeg);
mem_stream.Close();

你能给我一个示例,告诉我如何使用内存流以及如何将List<byte>数据写入其中吗? - MartGriff
我使用你的代码更新了示例,用于将数据读入缓冲区。如果你想的话,你可以改成Christain写的那个。 - SwDevMan81
这个链接失败了: System.Drawing.Image image = System.Drawing.Image.FromStream(mem_stream); 带有无效参数。 - MartGriff
我认为这通常意味着缓冲区中有一些无效字符。图像是如何编码的?您能否对原始图像和保存的图像进行差异比较以查看差异? - SwDevMan81
你可以在这里查看正在发布的数据:http://stackoverflow.com/questions/1547967/asp-http-post-read-data。这是因为图像信息被发送回主体,当写入文件时,所有信息都被放入其中吗? - MartGriff
这是因为图像信息被发送到了主体中,而我试图将整个主体转换为图像。 - MartGriff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接