Can't encode base64 for a jpg file

Hi everyone, I need some assistance, I’m trying to send a jpg file via
http post to a page in PHP, the file is sent in base64 encode, so the
page can convert it and save it to a directory in the server.

I have been able to acomplish this using Java and Python, but for some
reason I dont know, when I send via Ruby, the file is saved in the
server but its not a valid image file. I have tried the following

Method 1 (reading each char)
file64 = ‘’,“rb”) do |file|
file.each_char{|ch| file64+=ch }
encoded= [file64].pack(‘m’)

Method 2 (reading the whole file and packing it)
encoded = [open(filename, “rb”).read].pack(‘m’)

Method 3 (reading the whole file and using Base64)
file64 = open(filename, “rb”).read
encoded = Base64::encode64(file64)

Also, have tried to implement the script in this URL,
but I got the same result that the others.

Am I missing something? Is there a special way to do this? There is
something I noticed, the lines of the encoded file, are 60 chars long,
and in python and java are 75 long.

Thanks in advance.


I tried it out of curiosity and it worked with pack and encodet64 as
well. This is ruby 1.9.2p0 on Ubuntu 10.04 64. I was able to use the
tool “base64 -d” to decode the image data properly and view in gimp, as
well undecode in PHP.

$ cat test.png | ruby -e ‘puts [].pack “m”’ | php -r ‘echo
base64_decode(file_get_contents(“php://stdin”));’ >test2.png
$ md5sum test.png test2.png
f7fa630a147264f328e8b878ce7b39d9 test.png
f7fa630a147264f328e8b878ce7b39d9 test2.png

What version of ruby on which platform are you using?

  • Markus

Thanks Markus, I also tried to encode and decode from Ruby and it works
there, but when I send the encoded file to the PHP page, it somehow save
a different file, my development environment is a Windows XP and the
page is on a MacOs X Server, its on the same network that I’m.

When I posted via http post with java (using BASE64Encoder().encode from
package sun.misc.BASE64Encoder) the file size is 107,602 bytes, but from
ruby using the methods I listed before its 105,796 bytes.

the version of ruby i’m using is ruby 1.8.7 (2010-08-16 patchlevel 302)


I tested my code also with 1.8.7 -> works. However I don’t have that
version on Windows, I tested on Ubuntu.

I’m not sure, I’d try to start small. E.g. the code I pasted uses ruby &
PHP to encode/decode the file and it matches. Did you verify what the
plain outcome of base64 encode is from ruby and compared that to the
Java/Python version? Did they match?

Because if they match, maybe the problem is the HTTP POST transportation
(just a guess).


Yes you were right the problem was on the HTTP POST transportation, i
also needed to escape the data with URI.escape, it solved.

Again thanks a lot for your help.