Writing byte stream as jpeg format to disk

Navkirat Singh navkirats at gmail.com
Thu Aug 26 23:35:03 CEST 2010


On 27-Aug-2010, at 2:58 AM, Navkirat Singh wrote:

> 
> On 27-Aug-2010, at 2:48 AM, MRAB wrote:
> 
>> On 26/08/2010 21:47, Navkirat Singh wrote:
>>> 
>>> On 27-Aug-2010, at 1:57 AM, MRAB wrote:
>>> 
>>>> On 26/08/2010 21:14, Navkirat Singh wrote:
>>>>> 
>>>>> On 27-Aug-2010, at 1:32 AM, Dave Angel wrote:
>>>>> 
>>>>>> Navkirat Singh wrote:
>>>>>>> Hey guys,
>>>>>>> 
>>>>>>> I am programming a webserver, I receive a jpeg file with the POST
>>>>>>> method.The file (.jpeg) is encoded in bytes, I parse the bytes by
>>>>>>> decoding them to a string. I wanted to know how i could write the
>>>>>>> file (now a string) as a jpeg image on disk. When I try to encode the
>>>>>>> same string to a bytes and write them in binary format to disk, the
>>>>>>> file is not recognized as jpeg. I would be grateful if someone could
>>>>>>> help me with this.
>>>>>>> 
>>>>>>> 
>>>>>>> Regards,
>>>>>>> Nav
>>>>>> If by "decoding them to a string" you mean converting to Unicode, then
>>>>>> you've already trashed the data. That's only valid if the bytes had
>>>>>> been encoded from valid Unicode characters, and then only if you use
>>>>>> the corresponding decoding technique.
>>>>>> 
>>>>>> If you mean some other decoding, then the question is meaningless
>>>>>> without telling us just what the decoding is, preferably with some code.
>>>>>> 
>>>>>> It also might be useful to know what version of Python you're using,
>>>>>> when you post the code.
>>>>>> 
>>>>>> DaveA
>>>>>> 
>>>>> 
>>>>> Dave,
>>>>> 
>>>>> I am using Python3 and I receive a byte stream with a jpeg attached sent
>>>>> by the web browser over a socket, which looks like this:
>>>>> 
>>>>> b': image/jpeg\r\nAccept: text/*\r\nReferer:
>>>>> http://127.0.0.1:8001/\r\nAccept-Language: en-us\r\nAccept-Encoding:
>>>>> gzip, deflate\r\nContent-Length: 91783\r\nConnection:
>>>>> keep-alive\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00\x84\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\n\x07\x07\x06\x08\x0c\n\x0c\x0c\x0b\n\x0b\x0b\r\x0e\x12\x10\r\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15\x15\x0c\x0f
>>>>> 
>>>>> From the above, I need to:
>>>>> 
>>>>> a) Split the header content from the image content, which comes after
>>>>> the keep-alive\r\n\r\n part
>>>>> 
>>>>> b) Then write the image content to file for further use as a jpeg.
>>>>> 
>>>> Try:
>>>> 
>>>>   image = header.split(b'keep-alive\r\n\r\n', 1)[-1]
>>>>   open(image_path, 'wb').write(image)
>>>> --
>>>> http://mail.python.org/mailman/listinfo/python-list
>>> 
>>> I think I forgot to mention that the original is a stream of bytes decoded using ISO-8859-1 as utf-8 trhrew errors (lack of knowlegdge again).
>>> 
>>> @MRAB - the split() method in python 3 works only on strings and throws an error if I try to use bytes
>>> 
>> All i can say is that it works for me:
>> 
>>>>> header = b': image/jpeg\r\nAccept: text/*\r\nReferer: http://127.0.0.1:8001/\r\nAccept-Language:  en-us\r\nAccept-Encoding: gzip, deflate\r\nContent-Length: 91783\r\nConnection: keep-alive\r\n\r\n\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00\x84\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\n\x07\x07\x06\x08\x0c\n\x0c\x0c\x0b\n\x0b\x0b\r\x0e\x12\x10\r\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15\x15\x0c\x0f'
>>>>> image = header.split(b'keep-alive\r\n\r\n', 1)[-1]
>>>>> image
>> b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00\x84\x00\x03\x02\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\n\x07\x07\x06\x08\x0c\n\x0c\x0c\x0b\n\x0b\x0b\r\x0e\x12\x10\r\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15\x15\x0c\x0f'
>> 
>> What error did you get?
>> -- 
>> http://mail.python.org/mailman/listinfo/python-list
> 
> Hi MRAB,
> 
> Here is the error:
> 
>>>> b = b'asdf'
>>>> type(b)
> <class 'bytes'>
>>>> s = b.split(':')
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> TypeError: Type str doesn't support the buffer API
>>>> 
> 
> 
I got your point 

The argument for the split I have give is a string, hence the error.


More information about the Python-list mailing list