【问题标题】:PHP Decode Base64, Refresh and Keep dataPHP 解码 Base64,刷新并保留数据
【发布时间】:2011-06-28 17:30:48
【问题描述】:

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

索引.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。 (在谷歌浏览器上工作)

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

【问题讨论】:

    标签: java php android


    【解决方案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 文件。

    【讨论】:

    • 您好,非常感谢您的快速回复!我试过了,但这似乎不起作用: 请注意,我的 php 很烂:s
    • 请不要将代码 sn-ps 放入 cmets。他们无法阅读。从我痛苦的眼睛可以看出,您正在输出两个内容类型的标题。
    • 是的,好的,对不起。 Stackoverflow 的新手。我将编辑上面的主题,将其添加到底部。感谢您的关注。
    • 虽然,图片必须显示在网络浏览器上,因为这是用于某种直播。如果人们必须下载这些文件,那将毫无用处。 :s
    • 标题/读取文件将在浏览器中显示。它只是消除了浏览器解析 html sn-p 并启动​​新的 http 请求以获取文件的额外步骤。
    【解决方案2】:

    回答问题 2:

    不,这不安全。您真的应该在传输过程中对其进行签名或彻底加密,以确保您可以信任您获得的数据——它要么是你的,要么是垃圾。查看mcrypt() 了解更多信息。

    【讨论】:

    • 您好,感谢您提供此信息。但是我也在寻找检查我的 JAVA 代码中的参数是否等于我的 PHP 中的代码的东西,这样,我可以选择一个用户并给他权限(通过给他参数),所以他可以发送它。
    • 将其包含在加密部分中,这样您就不会受到欺骗或 MITM 攻击 =) 编辑:as 易受攻击
    • 好的,谢谢,问题 2 会解决的。虽然,你知道这在 php 中会是什么样子吗?我想我可能会解决 mcrypt("Thanks for this :D")
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 2017-03-05
      • 2019-03-18
      • 2012-11-30
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      相关资源
      最近更新 更多