PHP解码Base64,刷新和保存数据

时间:2011-06-28 17:30:49

标签: java php android

我有一个用HTTP Post方法上传的图像到我用PHP编写的网络服务器。 我的代码将位图压缩为jpeg编码的字节数组,并将该Base64编码发送到服务器进行解码,将其写入文件并将其作为jpg图像打开。

的index.php:

<?php
$base=$_REQUEST['image'];
echo $base;
// base64 encoded utf-8 string
$binary=base64_decode($base);
// binary, utf-8 bytes
header('Content-Type: bitmap; charset=utf-8');
// print($binary);
//$theFile = base64_decode($image_data);
$file = fopen('test.jpg', 'wb');
fwrite($file, $binary);
fclose($file);
echo '<img src=test.jpg>';
?>

我在同一目录中有一个空的0kb test.jpg。

有时我可以在快速按下F5(刷新)时看到图像,但是当我再次刷新时,图像会再次被删除,并且它再次被0KB。 (在Google Chrome上工作)

1)如何让图片继续显示写入test.jpg的数据并且不会变回0kb?因此,当我查看它时,图片仍然存在。 (请注意,我的PHP知识不太好,所以非常感谢指导。)

JAVA中的上传方法,Android:

public void uploadFrame(byte[] Frame, String WebClient) {
    String ba1=Base64.encodeBytes(mCurrentFrame);
    ArrayList<NameValuePair> nameValuePairs = new
    ArrayList<NameValuePair>();
       nameValuePairs.add(new BasicNameValuePair("image",ba1));

       try{

           HttpClient httpclient = new DefaultHttpClient();
           HttpPost httppost = new
           HttpPost(WebClient);
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           HttpResponse response = httpclient.execute(httppost);
           HttpEntity entity = response.getEntity();
           is = entity.getContent();
     }catch(Exception e){
           Log.e("log_tag", "Error in http connection "+e.toString());
     }
}

2)另一个问题是,如果这种方法实际上是安全的,因为人们可以向它发送任何POST方法数据并显示任何图片。那么在PHP中如何首先检查JAVA中的参数是否等于PHP代码中的参数,因此只有具有相同参数的人才能将此代码上传到他的网络服务器。

对于某些人来说,这可能是一个非常有趣的主题。

编辑:

<?php

    if (isset($_REQUEST['image'])) {
        $base=$_REQUEST['image'];
        echo $base;
        // base64 encoded utf-8 string
        $binary=base64_decode($base);
        // binary, utf-8 bytes
        header('Content-Type: bitmap; charset=utf-8');
        // print($binary);
        //$theFile = base64_decode($image_data);
        $file = fopen('test.jpg', 'wb');
        fwrite($file, $binary);
        fclose($file);
        echo '<img src=test.jpg>';
    }

        header('Content-type: image/jpeg');
        readfile('test.jpg');
    ?>

3 个答案:

答案 0 :(得分:1)

每次刷新页面时,都会将数据写入test.jpg文件。如果你不提交base64图像,它只会写出一个空/空字符串,这意味着一个0字节的文件。

相反,试试这个:

<?php

if (isset($_REQUEST['image'])) {
   ... your decoding/fopen/fwrite stuff here ...
}

header('Content-type: image/jpeg')
readfile('test.jpg');

这将直接以jpg格式输出图像,而不是输出HTML并强制浏览器打开另一个HTTP连接来加载.jpg文件。

答案 1 :(得分:1)

回答问题2:

不,这不安全。你应该真的签名或者在传输过程中对它进行彻底加密,以确保你可以信任你得到的数据 - 它可能是你的,也可能是垃圾。有关详细信息,请查看mcrypt()

答案 2 :(得分:0)

快速警告:如果您将标题设置为我的位图,请不要将HTML写入屏幕:(echo '<img src=test.jpg>';

我会将标题回显为image/jpeg,然后将原始二进制文件写入屏幕。