2009-10-15 155 views
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(); 

的图像内容类型的应用程序/八位字节流

谁能闪耀任何请点亮此。

+0

你问的应用程序/八位字节流是什么或者怎么改到不同的MIME类型? – 2009-10-15 13:44:32

+0

另外,通过“失败”,你的意思是? – 2009-10-15 13:47:02

+0

当我把失败我的意思是图像不会打开,格式不正确。在Notpad中打开它,并可以看到标题和内容。 – MartGriff 2009-10-15 14:12:35

回答

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

完整的示例(使用你的榜样,但如果你想改怎么二进制数据是从其他职位读,这是没有过,只是confinue从你有缓冲后):

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

你能否给我一个例子,我将如何使用内存流以及如何将数据写入列表。 – MartGriff 2009-10-15 14:10:46

+0

我使用您的代码更新了示例,将数据读入缓冲区。如果你愿意的话,你可以把它改成克里斯汀写的。 – SwDevMan81 2009-10-15 14:23:42

+0

该链接失败: System.Drawing.Image image = System.Drawing.Image.FromStream(mem_stream); 与无效的参数 – MartGriff 2009-10-15 14:33:55

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