【问题标题】:encode and decode base64 excpetion storing to sql server 2008 r2编码和解码base64异常字符串到sql server 2008 r2
【发布时间】:2013-06-03 13:24:10
【问题描述】:

我有一个 android 客户端,我想将图像从我的 android 发送到我的服务器,我将图像转换为字节数组,然后将字节数组转换为 base64,我将 base64 字符串发送到服务器,我在服务器中对其进行解码然后将其存储在我的 sql server 2008 r2 中。

我的问题

我无法将字符串存储到我的数据库然后正确检索它,我没有得到任何异常并且我得到了结果,但它似乎是错误的结果。

我通过这样做得出结论。

1- 我将 base64 从 android 发送到服务器,并将检索到的字符串保存在静态变量中。 2-我要求服务器检索静态字符串,我得到了 android 中的图像。 3-但是当我要求服务器检索我认为我将其保存在数据库中的图像时,我得到了错误的图像,实际上我得到了结果,但这个结果无法再次解码。

我会告诉你我在数据库中插入和检索图像的代码,请告诉我我做错了什么,

存储到数据库

void uploadImage(String image) {
Connection con = Database.getConnection();
        CallableStatement callableStatement = null;
        try {
            callableStatement = con
                    .prepareCall("{call insertRestaurantFoodImage(?,?)}");
            ByteArrayInputStream b = new ByteArrayInputStream(
                    stringImage.getBytes());
            callableStatement.setInt(1, ID);
            ;
            callableStatement.setBinaryStream(2, b,
                    stringImage.getBytes().length);
            callableStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
}

插入图片的存储过程是

ALTER PROCEDURE dbo.insertRestaurantFoodImage
    (
    @restaurantFoodID INT,
    @image VARBINARY(MAX)
    )
AS
BEGIN
    SET NOCOUNT ON
    UPDATE Food_Restaurant
    SET [image] = @image
    WHERE ID = @restaurantFoodID
END

从数据库中检索

Connection con = Database.getConnection();
            CallableStatement callableStatement = null;
            try {
                callableStatement = con
                        .prepareCall("{call getRestaurantFoodImage(?,?)}");
                callableStatement.setInt(1, getID());
                callableStatement.registerOutParameter(2,
                        java.sql.Types.VARBINARY);
                callableStatement.execute();
                byte[] bytes = callableStatement.getBytes(2);
                image = new String(bytes);
            } catch (SQLException e) {
                e.printStackTrace();
            }

要从数据库中检索的存储过程是:

ALTER PROCEDURE dbo.getRestaurantFoodImage
(
    @foodRestaurantID INT,
    @image VARBINARY(MAX) OUTPUT
    )
AS
BEGIN
    SET NOCOUNT ON
    SELECT @image = [image]
    FROM Food_Restaurant
    WHERE ID = @foodRestaurantID
END

也许我说的太多了,但在之前的问题中,一位用户告诉我,我不仅要输入代码,而且还要把我的问题和我在做什么。

对于那些问我如何在 android 中编码和解码的用户,这里是:

编码

private byte[] getBytesFromBitmap(Bitmap bitmap) {
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 70, stream);
        return stream.toByteArray();
    }

    private String getBase64(Bitmap bitmap) {
        String imgString = Base64.encodeToString(getBytesFromBitmap(bitmap),
                Base64.NO_WRAP);
        return imgString;
    }

解码

String retrievedBase63 = client2
                .getBaseURI("restaurantFoods/OneFood/" + 5 + "/getImage");
        //Log.d("image", image);
        byte[] decodedString = Base64.decode(retrievedBase63, Base64.DEFAULT);
        Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,
                decodedString.length);

【问题讨论】:

  • 在android上使用jdbc是个坏主意...最好为此制作webservice ...
  • @Selvin 我在服务器伙伴中使用了 jdbc
  • @Selvin 我已经在使用 REST Jersey 网络服务,但我没有告诉你。
  • 如何从 Bitmap 转换为 byte[] ?
  • 在 android 中,问题不存在,因为正如我在问题的开头告诉你的那样,当我将图像发送到 android 并将其保存在静态属性中而不将其保存到我的数据库和然后再次将该静态属性检索到android我可以看到图像并将其放入imageview中,所以问题在于编码和解码

标签: java android sql-server-2008-r2 encode android-image


【解决方案1】:

正如我对jdbc stored png image at sql server 2008 r2 gives not complete data 的评论(和回复)一样,旧版本的 SQL Server 对varbinaryvarchar 的限制为 8kb。要么驱动程序不再支持getBytesgetString,要么您可能使用的是较旧的 JDBC 驱动程序。另一种可能是您需要将 OUT 参数注册为java.sql.types.LONGVARBINARY(或LONGVARCHAR)。

无论如何(也在另一个问题中),我想知道为什么您在存储数据之前首先在 base64 中进行编码。只需将原始字节存储在 VARBINARY 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多