2009-10-15 15 views
3

Je lis les données d'une application iPhone qui utilise http POST pour transférer l'image sur le serveur Je peux lire ceci dans un binaire et il écrit dans un fichier (voir ci-dessous) le problème que j'ai est quand J'ouvre l'image il échoue.Écrire fichier binaire

Vous pouvez voir le code de l'iPhone sur ce post: asp http POST Read Data

code:

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

L'image Content-Type est une application/octet-stream

Quelqu'un peut-il briller tout la lumière sur ceci s'il vous plaît.

+0

Demandez-vous ce qu'est un flux d'octets d'application/ou comment le changer à un autre type MIME? –

+0

En outre, par "échoue", waht voulez-vous dire? –

+0

quand j'ai mis échoué je veux dire l'image ne s'ouvrira pas, format incorrect. L'a ouvert dans Notpad et peut voir l'en-tête et le contenu. – MartGriff

Répondre

1

Est-ce que les travaux suivants Pour cela, il serait sans doute préférable de changer le FileStream à un MemoryStream

fs.Position = 0; 
Bitmap bit_map = Bitmap.FromStream(fs) as Bitmap; 
bit_map.Save(@"C:\test\test.jpg"); 

Ou

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

exemple complet (en utilisant votre exemple, mais si vous voulez pour changer la façon dont les données binaires sont lues à partir de l'autre poste, qui est très bien aussi, juste confinue de fois que vous avez la mémoire tampon):

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

Pouvez-vous me donner un exemple comment j'utiliserais le flux de mémoire et comment j'écrirais les données de la liste dans ceci. – MartGriff

+0

J'ai mis à jour l'exemple en utilisant votre code pour lire les données dans le tampon. Vous pouvez changer cela à ce que Christain a écrit si vous voulez. – SwDevMan81

+0

Echec de ce lien: System.Drawing.Image image = System.Drawing.Image.FromStream (mem_stream); Avec Pas un paramètre valide – MartGriff

3

Peut-être le Request.ContentLength n'a pas été défini correctement? Je sais d'expérience amère qu'il n'est pas toujours sûr de le faire confiance. :-(

Vous pouvez lire le flux sans connaître la longueur à l'avance comme ceci:

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