2012-09-18 5 views
2

여기에 나와있는 것처럼 상당한 양의 코드가 있습니다. 내가 변경 한 phonegap 플러그인이 있습니다. Java 부분은 base64 문자열을 출력합니다.Base64 Java에서 손상된 문자열

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 파일이 그것을 데이터 디코딩을 시도 할 때 : 이미지/PNG를, Base64로, 뿅, 난 그냥 당신이 디코더에 붙여의 용이성을 위해 그것을 제거한된다.

디코더는 여기에서 찾을 :

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

내가 생각할 수있는 모든 어떤 이유로 나는 자바에서 올바르게 base64로 문자열을 출력되지 않을 수 있다는 것이다. 아무도 무슨 일이 벌어지고 있니? 또는 무엇이 이것을 일으킬 수 있습니까?

+0

자바 스크립트로 보내기 전에 디코딩과 저장을 시도 했습니까? 아마 Sun Java로 해독 해봐야할까요? 이 링크를 확인하십시오 : http://stackoverflow.com/questions/469695/decode-base64-data-in-java –

+1

압축 단계에서 또는 압축 단계 이전에 손상되었는지 확인하기 위해 인코딩하기 전에 png 이미지를 저장해 보았습니까? ? – gigadot

+0

동일한 결과가 있는지 확인하기 위해 commons-codec Base64 인코더를 사용해 보셨습니까? 이 외부 요구 사항을 가지고는 안되지만 안드로이드 2.1 장치도 지원할 수 있습니다. 이것이 코르도바가 현재 Base64 인코딩에 사용하는 것입니다. –

답변

0

나는 지난 밤에 좋은 몇 시간 동안 이걸 가지고 놀았으며, 이러한 제안 중 일부를 고려했습니다.

먼저 인코딩하기 전에 이미지를 확인했습니다. 괜찮 았어.

그러나 Javascript로 이동하기 전에이를 디코딩하면 손상되었음을 알 수 있습니다. 이는 Java 인코딩 프로세스와 관련이 있어야한다는 것을 의미합니다. 이 문제를 해결하기 위해, 100 %는 그런 일이 왜 이해에 내가 주장하지 않습니다,하지만 문제는이 코드를 배치 할 것 같습니다 :

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

그리고 그 길을 내가 "데이터 추가했다 :/이미지/PNG를, base64, "자바 스크립트와 PHP 디코더로 보내기 전에.

String mytextstring = base64String; 

을 그리고 거기에 문자열로 추가 한 서버로 전송 내 자바 스크립트 함수에서,이 작품과 나는 손상되지 않은 이미지를받은 :이 문제를 해결하려면이되었다 그래서 자바 코드에서 삭제. 그냥에서의 경우 사람이 궁금해/I 대신 추가 자바 스크립트 기능은 다음과 같습니다 관심 :

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; 

이전에 자바에 의해 추가 된 섹션을 추가합니다. 이 지금 작동합니다. 희망이 사람을 미래에 도움이됩니다. 누군가가 광고를 언급하는 데 관심이 있다면 왜 그들이 자유롭게 느끼는지를 설명하십시오. :)