0

私は次の方法を持っています:

 /**
  * Encodes the byte array into base64 string
  * @param imageByteArray - byte array
  * @return String a {@link java.lang.String}
  */
public static String encodeImage(byte[] imageByteArray) {
    return Base64.encodeBase64URLSafeString(imageByteArray);
}

「org.apache.commons.codec.binary.Base64;」をインポートしています。ただし、次のエラーが表示されます。

この行に複数のマーカー - メソッド encodeBase64URLSafeString(byte[]) は Base64 型に対して未定義です - 行ブレークポイント:MySQLConnection [行: 287] - encodeImage(byte[])

このコードを「http://www.myjeeva.com/2012/07/how-to-convert-image-to-string-and-string-to-image-in-Java/」からコピーしました。私は Eclipse Juno (完全に更新された) と GWT を使用しています。

ここで私が間違っていることを誰かが知っていますか?

よろしく、

グリン

Markus A さん、ありがとうございます。あなたの情報からこのクラスを作成しました。

package org.AwardTracker.server;

public class Base64Decode {
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

public static byte[] decode(String s) {

    // remove/ignore any characters not in the base64 characters list
    // or the pad character -- particularly newlines
    s = s.replaceAll("[^" + base64chars + "=]", "");

    // replace any incoming padding with a zero pad (the 'A' character is
    // zero)
    String p = (s.charAt(s.length() - 1) == '=' ? (s.charAt(s.length() - 2) == '=' ? "AA"
            : "A")
            : "");

    s = s.substring(0, s.length() - p.length()) + p;
    int resLength = (int) Math.ceil(((float) (s.length()) / 4f) * 3f);
    byte[] bufIn = new byte[resLength];
    int bufIn_i = 0;

    // increment over the length of this encrypted string, four characters
    // at a time
    for (int c = 0; c < s.length(); c += 4) {

        // each of these four characters represents a 6-bit index in the
        // base64 characters list which, when concatenated, will give the
        // 24-bit number for the original 3 characters
        int n = (base64chars.indexOf(s.charAt(c)) << 18)
                + (base64chars.indexOf(s.charAt(c + 1)) << 12)
                + (base64chars.indexOf(s.charAt(c + 2)) << 6)
                + base64chars.indexOf(s.charAt(c + 3));

        // split the 24-bit number into the original three 8-bit (ASCII)
        // characters

        char c1 = (char) ((n >>> 16) & 0xFF);
        char c2 = (char) ((n >>>8) & 0xFF);
        char c3 = (char) (n & 0xFF);

        bufIn[bufIn_i++] = (byte) c1;
        bufIn[bufIn_i++] = (byte) c2;
        bufIn[bufIn_i++] = (byte) c3;

    }

    return bufIn;
}


}

そして呼び出しを次のように変更しました: import org.AwardTracker.server.Base64Decode;

public static String encodeImage(byte[] imageByteArray) {
    return Base64Decode(imageByteArray); [Error on this line]
}

そして、私は今エラーを受け取ります:

この行に複数のマーカー - メソッド Base64Decode(byte[]) はタイプ MySQLConnection に対して未定義です

大変助かりました。

よろしく、

グリン

ラウンド 3

OK、暗号化と復号化の方法が間違っていました。これは修正され、正しいライブラリに配置されました。ただし、encodeImage メソッドにはまだエラーがあります。これは、encodeImage メソッドを呼び出すために使用するメソッドです。私は次の行を疑っています:

java.sql.Blob imageBlob = result.getBlob(1);
byte[] imageData = imageBlob.getBytes(1, (int) imageBlob.length());

正しくありません。ただし、ImageData を byte[] として定義したので、encodeImage がそれを文字列と見なす理由がわかりません。

public String getImageData(String id){
    ResultSet result = null;
    PreparedStatement ps = null;
    String imageDataString = null;
    try {
        // Read in the image from the database.
        ps = conn.prepareStatement(
              "SELECT at_cub_details.cd_photograph " +
                      "FROM at_cub_details " + 
                      "WHERE at_cub_details.cd_id = \"" + id + "\"");
        result = ps.executeQuery();
        while (result.next()) {
            java.sql.Blob imageBlob = result.getBlob(1);
            byte[] imageData = imageBlob.getBytes(1, (int) imageBlob.length());

            //Convert Image byte array into Base64 String
            imageDataString = encodeImage(imageData);
        }

    }

エラーが発生する:

public static String encodeImage(byte[] imageByteArray) {
    return Base64Encode.encode(imageByteArray); [Error on this line]
}

「Base64Encode 型のメソッド encode(String) は、引数 (byte[]) には適用できません」の

ご助力いただきありがとうございます。

よろしく、

グリン

追伸、私はこの分野で決定的な仕事を見つけることができず、これが非常に頻繁に使用されると思っていたので、これが終わったらブログに値すると思います. 私の次のプロジェクト。

エンコード クラスは次のとおりです。

package org.AwardTracker.server;

public class Base64Encode {
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

public static String encode(String s) {

    // the result/encoded string, the padding string, and the pad count
    String r = "", p = "";
    int c = s.length() % 3;

    // add a right zero pad to make this string a multiple of 3 characters
    if (c > 0) {
        for (; c < 3; c++) {
            p += "=";
            s += "\0";
        }
    }

    // increment over the length of the string, three characters at a time
    for (c = 0; c < s.length(); c += 3) {

        // we add newlines after every 76 output characters, according to
        // the MIME specs
        if (c > 0 && (c / 3 * 4) % 76 == 0)
            r += "\r\n";

        // these three 8-bit (ASCII) characters become one 24-bit number
        int n = (s.charAt(c) << 16) + (s.charAt(c + 1) << 8)
                + (s.charAt(c + 2));

        // this 24-bit number gets separated into four 6-bit numbers
        int n1 = (n >> 18) & 63, n2 = (n >> 12) & 63, n3 = (n >> 6) & 63, n4 = n & 63;

        // those four 6-bit numbers are used as indices into the base64
        // character list
        r += "" + base64chars.charAt(n1) + base64chars.charAt(n2)
                + base64chars.charAt(n3) + base64chars.charAt(n4);
    }

    return r.substring(0, r.length() - p.length()) + p;
}
}

Decode クラスは次のとおりです。

package org.AwardTracker.server;

public class Base64Decode {
private final static String base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

public static byte[] decode(String s) {

    // remove/ignore any characters not in the base64 characters list
    // or the pad character -- particularly newlines
    s = s.replaceAll("[^" + base64chars + "=]", "");

    // replace any incoming padding with a zero pad (the 'A' character is
    // zero)
    String p = (s.charAt(s.length() - 1) == '=' ? (s.charAt(s.length() - 2) == '=' ? "AA"
            : "A")
            : "");

    s = s.substring(0, s.length() - p.length()) + p;
    int resLength = (int) Math.ceil(((float) (s.length()) / 4f) * 3f);
    byte[] bufIn = new byte[resLength];
    int bufIn_i = 0;

    // increment over the length of this encrypted string, four characters
    // at a time
    for (int c = 0; c < s.length(); c += 4) {

        // each of these four characters represents a 6-bit index in the
        // base64 characters list which, when concatenated, will give the
        // 24-bit number for the original 3 characters
        int n = (base64chars.indexOf(s.charAt(c)) << 18)
                + (base64chars.indexOf(s.charAt(c + 1)) << 12)
                + (base64chars.indexOf(s.charAt(c + 2)) << 6)
                + base64chars.indexOf(s.charAt(c + 3));

        // split the 24-bit number into the original three 8-bit (ASCII)
        // characters

        char c1 = (char) ((n >>> 16) & 0xFF);
        char c2 = (char) ((n >>>8) & 0xFF);
        char c3 = (char) (n & 0xFF);

        bufIn[bufIn_i++] = (byte) c1;
        bufIn[bufIn_i++] = (byte) c2;
        bufIn[bufIn_i++] = (byte) c3;

    }

    return bufIn;
}


}

私は最終的に動作するエンコードクラスを見つけました:

package org.AwardTracker.server;

public class Base64Encode2 {
 private final static char[] ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

    private static int[]  toInt   = new int[128];

    static {
        for(int i=0; i< ALPHABET.length; i++){
            toInt[ALPHABET[i]]= i;
        }
    }

/**
 * Translates the specified byte array into Base64 string.
 *
 * @param buf the byte array (not null)
 * @return the translated Base64 string (not null)
 */
public static String encode(byte[] buf){
    int size = buf.length;
    char[] ar = new char[((size + 2) / 3) * 4];
    int a = 0;
    int i=0;
    while(i < size){
        byte b0 = buf[i++];
        byte b1 = (i < size) ? buf[i++] : 0;
        byte b2 = (i < size) ? buf[i++] : 0;

        int mask = 0x3F;
        ar[a++] = ALPHABET[(b0 >> 2) & mask];
        ar[a++] = ALPHABET[((b0 << 4) | ((b1 & 0xFF) >> 4)) & mask];
        ar[a++] = ALPHABET[((b1 << 2) | ((b2 & 0xFF) >> 6)) & mask];
        ar[a++] = ALPHABET[b2 & mask];
    }
    switch(size % 3){
        case 1: ar[--a]  = '=';
        case 2: ar[--a]  = '=';
    }
    return new String(ar);
}

}

マルクス A さん、ご協力ありがとうございます。

よろしく、

グリン

4

1 に答える 1

1

GWT は apache commons パッケージを提供していないため、コードでこの関数をそのまま使用することはできないと思います。

GWT で使用できるものは次のとおりです。

https://developers.google.com/web-toolkit/doc/latest/RefJreEmulation

それを使用したい場合は、Base64 クラス (およびそのすべての依存関係) のソース コードを実際に入手し、GWT コンパイラーがアクセスして JavaScript に変換できる場所にそれをプロジェクトに配置する必要があります。

エンコードを行うその他の方法については、こちらを参照してください。

GWT を使用して短い文字列を Base64 としてエンコード/デコードするにはどうすればよいですか?

元の投稿に追加された新しい質問の追加:

まず、次のようなクラスで静的関数を呼び出す必要があります。

return Base64Decode.decode(imageByteArray);

しかし、あなたのタイプも逆になっているようです.encodeImageはバイト[]を取り、文字列を返しますが、Base64Decode.decodeは文字列を取り、バイト[]を返します. おそらく、decode 関数の代わりに同等の Base64Encode.encode 関数を使用する必要があります。

于 2013-02-11T03:39:39.093 に答える