java - 来自 Java 的 Base64 字符串损坏

标签 java cordova base64 decode

我修改了一个 phonegap 插件。 Java部分输出一个base64字符串:

package org.apache.cordova;

import java.io.ByteArrayOutputStream;
import java.io.File;

import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;

import android.annotation.TargetApi;
import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Base64;
import android.view.View;



public class Screenshot extends Plugin {

    @Override

    public PluginResult execute(String action, JSONArray args, String callbackId) {
        // starting on ICS, some WebView methods
        // can only be called on UI threads
        final Plugin that = this;
        final String id = callbackId;
        super.cordova.getActivity().runOnUiThread(new Runnable() {
            //@Override
            @TargetApi(8)
            public void run() {
                View view = webView.getRootView();

                view.setDrawingCacheEnabled(true);
                Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
                view.setDrawingCacheEnabled(false);

                File folder = new File(Environment.getExternalStorageDirectory(), "Pictures");
                if (!folder.exists()) {
                    folder.mkdirs();

                }

                File f = new File(folder, "screenshot_" + System.currentTimeMillis() + ".png");
                System.out.println(folder);
                System.out.println("screenshot_" + System.currentTimeMillis() + ".png");



                ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                byte[] b = baos.toByteArray();
                String base64String = Base64.encodeToString(b, Base64.DEFAULT);
                String mytextstring = "data:image/png;base64,"+base64String;
                System.out.println(mytextstring);

                that.success(new PluginResult(PluginResult.Status.OK, mytextstring), id);
            }
        });

        PluginResult imageData = new PluginResult(PluginResult.Status.NO_RESULT);
        imageData.setKeepCallback(true);
        System.out.println("imageData=============>>>>>"+imageData);
        return imageData;
    }

}

然后我将它传递给一些 Javascript,然后将字符串发送到服务器。我检查了 .php 文件接收到的字符串,base64 字符串是相同的。但是,当我解码 base64 字符串时,它似乎已损坏。举个更好的例子,将这个文本文件的内容复制到解码器中。

http://dl.dropbox.com/u/91982671/base64.txt

注意:当 .php 文件尝试解码它时,data:image/png;base64 是 infront,为了便于您将其粘贴到解码器中,我刚刚将其删除。

在这里找到解码器:

http://www.motobit.com/util/base64-decoder-encoder.asp

我能想到的是,出于某种原因,我可能无法从 Java 中正确输出 base64 字符串。有谁知道发生了什么事?或者什么可能导致这个?

最佳答案

我昨晚玩了好几个小时,并考虑了其中的一些建议。

首先我在编码之前检查了图像。很好。

然而,在它进入 Javascript 之前对其进行解码表明它已损坏,这意味着它必须与 Java 编码过程有关。为了解决这个问题,我并不声称 100% 理解它发生的原因,但问题似乎在于这段代码:

String mytextstring = "data:image/png;base64,"+base64String;

以及我在将其发送到 Javascript 和 PHP 解码器之前添加“data:/image/png;base64”的方式。为了解决这个问题,我将其从 Java 代码中删除,因此它变成了:

String mytextstring = base64String;

在我将它发送到服务器的 JavaScript 函数中,我将它添加到那里的字符串中,这有效并且我收到了一个未损坏的图像。以防万一有人想知道/关心我在下面添加它的 Javascript 函数:

function returnScreenshotImage(imageData) { 
    base64string = "data:image/png;base64,"+imageData;
    console.log("String: "+base64string);

    var url = 'http://www.websitename.co.uk/upload.php';
    var params = {image: imageData};

    document.basicfrm.oldscreenshotimg.value = document.basicfrm.screenshotimg.value;

    // send the data
    $.post(url, params, function(data) {
           document.basicfrm.screenshotimg.value = data;

           });    
}

如你所见:

base64string = "data:image/png;base64,"+imageData;

添加之前由 Java 添加的部分。这现在有效。希望这对 future 的人有所帮助。如果有人愿意发表评论并解释为什么这是他们知道的自由的话。 :)

关于java - 来自 Java 的 Base64 字符串损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12480553/

相关文章:

java - 想要使用 arraylist 将 json 字符串反序列化为 java 对象

jquery-mobile - 如何加速 jquery mobile/phonegap?

javascript - iOS App Store 是否允许在 Phonegap/Cordova 应用程序中进行 Javascript 代码混淆?

java - 最佳编码方式

javascript - Base64转换错误

php - 从发布的屏幕截图数据 php 中删除 img src

java - 是将编程转换为实现吗?

java - 如何在 Eclipse 插件中的 IProgressMonitor 中设置精确工作?

Java Cryptonight 哈希算法 - 扩展 AES key 长度?

iphone - iOS 上 PhoneGap 2.0 的应用内购买 (IAP) 插件?