java - 为什么我不能用java和php进行base64编码和解码?

标签 java php android base64

我使用 php 在服务器上对图像进行编码,并通过 get 请求将编码后的字符串发送到 android,并使用 java 对其进行解码,但它输出错误的 base64 。

所以我决定在在线检查器上检查base64字符串,但图像没有出现是php编码的问题吗?

这是编码的图像字符串:

aW1hZ2VzL21haW4vd3d3L25ldCAtIENvcHkucG5n

PHP::

<?php


require_once("config.php");

if(isset($_GET["m"])) {

    $dirname = "images/main/";
    $arr = array();

    $conn = new mysqli(HOST, USERNAME, PASSWORD, DATABASE);

    if(!$conn) {
        echo "Error connecting to database";
        exit();
    }
    if($stmt = $conn->prepare("SELECT name_ FROM projects")) {
        $stmt->execute();
        $stmt->bind_result($n);
        //$stmt->store_result();
        $result = $stmt->get_result();
        if($result->num_rows == 0) {
            echo "No Projects";
            $stmt->close();
            $conn->close();
            exit();
        }else {
            while ($row = $result->fetch_assoc()) {
                $dirname = $dirname . $row["name_"] . "/";
                $images = glob($dirname . "*.*", GLOB_BRACE);
                foreach($images as $key => $image) {
                    $image = base64_encode($image);
                    //array_push($arr, $image);
                    $dirname = "images/main/";
                    echo $image;
                    echo "/n";
                    $image = "";
                }
            }
            //echo "hi";//json_encode($arr);
        }
    }

    $stmt->close();
    $conn->close();
    exit();

}

?>

安卓::

 @Override
    protected String doInBackground(String[] params) {
        String add = "http://10.0.2.2/wael/getimages.php?m=all";
        byte[] image = null;
        Bitmap real = null;
        String parsedString = "";
        BufferedReader bufferedReader = null;
        InputStream is = null;
        StringBuilder sb = null;
        HttpURLConnection httpConn = null;
        URLConnection conn = null;
        try {
            URL url = new URL(add);
            conn = url.openConnection();
            httpConn = (HttpURLConnection) conn;
            httpConn.setAllowUserInteraction(false);
            httpConn.setInstanceFollowRedirects(true);
            httpConn.setRequestMethod("GET");
            httpConn.connect();
            is = httpConn.getInputStream();
            sb = new StringBuilder();
            String line;
            bufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            bitmaps = new ArrayList<>();
            while ((line = bufferedReader.readLine()) != null) {
                sb.append(line).append("\\n");

                //image = Base64.decode(line, Base64.NO_PADDING);
                //real = BitmapFactory.decodeByteArray(image, 0, image.length);
                //bitmaps.add(real);
                //image = null;
                //real = null;
            }
            String[] lines = sb.toString().split("\\n");
            for(String s: lines){
               image = Base64.decode(s, Base64.URL_SAFE);
                real = BitmapFactory.decodeByteArray(image, 0, image.length);
                bitmaps.add(real);
                image = null;
                real = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (httpConn != null) {
                    httpConn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "done";
    }

提示::

使用 java 进行解码的所有类型模式均无法正常工作。对于 exmaple URL_SAFEDEFAULT 等都不起作用,所有输出都是相同的错误 base64

最佳答案

您不是对图像进行 Base64 编码,而是对图像的路径进行 Base64 编码。

这就好像有人说“给我发一张帝国大厦的照片”,然后你给他们写了一封信,上面写着“一张帝国大厦的照片”。

例如,在您的评论中您说

the following is still not outputing an image aW1hZ2VzL21haW4vd3d3L25ldCAtIENvcHkucG5n

但是如果我执行以下操作:

console.log(atob("aW1hZ2VzL21haW4vd3d3L25ldCAtIENvcHkucG5n"))

当你点击运行时你会看到

images/main/www/net - Copy.png

显然,这不是预期的结果。

在 PHP 中,您可以这样做:

$image = file_get_contents($filename);
$b64_image_raw = base64_encode($im);      
$mime = mime_content_type($filetype)
$b64_image = "data:" . $mime . ";base64," . $b56_image_raw;

这会给你类似的东西:

数据:图像/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAP1BMVEU7V507V50AAAA7V507V507V53///9GYaP7/P33+Pvm6vPa4O2aqM3s7/bf5O+8xd6uutigrdBfd7BNZ6c+ Wp9WPQrIAAAABXRSTLP0cwDze/4T5ZQAAABkSURBVCjP3c45DoAwDETRcUiclZ37n5UoFUUyEhIVv32yNTAyuX6TGIgbJwDRiqy36kuOGlNfj6StrvpZie7KdKmw+dGqUPUcbm5PP1d9FC6mmd6uVAtf9Vc FUCastTCCgULMDXttET4Wr4wGAAAAAElFTkSuQmCC

var image = document.createElement("img")
image.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAdCAMAAABhTZc9AAAAP1BMVEU7V507V50AAAA7V507V507V53///9GYaP7/P33+Pvm6vPa4O2aqM3s7/bf5O+8xd6uutigrdBfd7BNZ6c+Wp9WPQrIAAAABXRSTlP0cwDze/4T5ZQAAABkSURBVCjP3c45DoAwDETRcUiclZ37n5UoFUUyEhIVv32yNTAyuX6TGIgbJwDRiqy36kuOGlNfj6StrvpZie7KdKmw+dGqUPUcbm5PP1d9FC6mmd6uVAtf9VcFUcAStTCCgULMDXttET4Wr4wGAAAAAElFTkSuQmCC";
document.getElementById("image").appendChild(image)
<div id="image"></div>

关于java - 为什么我不能用java和php进行base64编码和解码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48291064/

相关文章:

java - 在 Java REST 客户端 [6.5] API 上使用 ES 6.5 中的映射创建索引

java - 线程代码...这有什么问题,必须使用 java 1.4

java - Log4j2 不写入文件

php - 准备好的语句和 mysqli_query/mysqli_num_rows?

php - get_headers() : SSL operation failed with code 1

java - 单元测试回调

android - 构建项目时 Android Studio 出现 AAPT 错误

java - 在 JLabel 上显示加密图像

php - MySQL 查询缺少第一条记录后的 foreach() 循环

java - setText ("test") 正在卡住 UI