如何将 Android sqlite BLOB 数据上传到 MySQL BLOB

How to upload Android sqlite BLOB data into MySQL BLOB

我正在开发一个项目,用户可以在其中将一些信息和图像存储到 SQLite 数据库中。图像存储为 BLOB 数据。现在我想将所有数据上传到我的 MySQL 数据库中。我正在使用 Volley 将所有行从 SQLite 逐行上传到 MySQL 服务器,并使用调用 Web API.

的 AsyncTask

没有图像 BLOB 数据一切正常。我不知道有什么方法可以使用 Volley 上传 blob 数据。 我在 Whosebug 上搜索了很多,但没有找到任何解决方案,请帮助我。

我给出了一些代码示例以使我的问题更容易理解。

这是我在 AsyncTask 中调用的函数:

/**
 * function to upload data into server
 * */
private void SyncTaskDoInBack(final dataDB data) {
    // Tag used to cancel the request
    String tag_string_req = "Inserting Online";

    StringRequest strReq = new StringRequest(Method.POST, AppConfig.API_LINK, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            try {
                JSONObject jObj = new JSONObject(response);
                boolean error = jObj.getBoolean("error");

                // Check for error node in json
                if (!error) {
                    Log.d(TAG, "Success");
                } else {
                    // Error in found
                    String errorMsg = jObj.getString("error_msg");
                }
            } catch (JSONException e) {
                // JSON error
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Error: " + error.getMessage());
        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting parameters to login url
            Map<String, String> params = new HashMap<String, String>();
            params.put("ID", data._id);
            params.put("PersonName", data.pName);
            params.put("Photo", data.photo.toString());

            return params;
        }

    };

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}

我的"dataDB"Class如下:

public class dataDB implements Comparable<dataDB>{

    String _id = null;
    String pName = null;
    byte[] photo = null;

    @Override
    public int compareTo(dataDB o) {
        //return title.toLowerCase().compareTo(o.title.toLowerCase());
        return 0;
    }

}

列表数据模型class如下:

public class ListDataModel {

private int _id;
private String name;
private byte[] image;

public ListDataModel() { }

public ListDataModel(String name, String thumbnailUrl) {
    this.name = name;
    this.thumbnailUrl = thumbnailUrl;
}

// getting ID
public int getID() {
    return this._id;
}

// setting id
public void setID(int keyId) {
    this._id = keyId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public byte[] getImage() {
    return this.image;
}

public void setImage(byte[] image) {
    this.image = image;
}

}

在 Whosebug 中进行了大量搜索后,我得出了以下公式,它似乎可以将相机图像生成为 Base64 字符串,反之亦然。希望这会对其他人有所帮助。

我正在使用 Apache Commons Codec for Base64 encode/decode 从这里 http://commons.apache.org/proper/commons-codec/ (我认为可以使用 Android 默认 Base64 class,我也将其用于其他目的)

这是我的 onActivityResult 函数

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode != RESULT_OK)
        return;

    switch (requestCode) {

        case CAMERA_REQUEST:

            Bundle extras = data.getExtras();

            if (extras != null) {

                Bitmap myImage = extras.getParcelable("data");

                ByteArrayOutputStream bao = new ByteArrayOutputStream();
                myImage.compress(Bitmap.CompressFormat.JPEG, 90, bao);

                imageInByte = bao.toByteArray();

                imageInBase64Str = Base64.encodeBytes(imageInByte); // using internal class
            }

            break;
    }
}

然后我将 Base64 字符串 imageInBase64Str 传递到我的 SQlite 插入语句和 MySQL 在线数据库。

当从 SQLite 或 MySQL 获取图像 Base64 编码数据进行查看时,我按以下方式处理我的图像:

 try {
        byte[] decodedByte = Base64.decode(imageData, 0);
        theImage = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
 }catch (IOException io){
        Log.d("ViewRecord",io.getMessage());
 }

就是这样:)