Java 在servlet和jsp中从数据库检索bytearray

Java 在servlet和jsp中从数据库检索bytearray,java,image,jsp,jakarta-ee,Java,Image,Jsp,Jakarta Ee,我真的不理解字节数组…可能是因为我第一次处理图像,所以需要您的帮助 我有base64字符串R0LGodlhdwapakecaaaaAaAaAaAaAaAaAaAaAzm/////waaacwaaAaAaAaAaAaAaAaCiispeqhsrz5Modrlln48cxf8m2iq3ymmkqvlrtw4mlwwach H09wdgltaxplzcbiesbvbhzcbtbwfydfyndmvyiqaw== 我对其进行解码并将其存储在MySql数据库中,然后在servlet端使用以下代码 if (

我真的不理解字节数组…可能是因为我第一次处理图像,所以需要您的帮助

我有base64字符串R0LGodlhdwapakecaaaaAaAaAaAaAaAaAaAaAzm/////waaacwaaAaAaAaAaAaAaAaCiispeqhsrz5Modrlln48cxf8m2iq3ymmkqvlrtw4mlwwach H09wdgltaxplzcbiesbvbhzcbtbwfydfyndmvyiqaw==

我对其进行解码并将其存储在MySql数据库中,然后在servlet端使用以下代码

if ( request.getParameter("imgID") != null )
    {

      iNumPhoto = Integer.parseInt(request.getParameter("imgID")) ;   


      try
      {  
                Class.forName("com.mysql.jdbc.Driver").newInstance();
               conn=DriverManager.getConnection("jdbc:mysql://localhost:9191/mbcss","root","admin");
               stmt= conn.createStatement();

         //conn.setAutoCommit (false);  

         // get the image from the database
         byte[] imgData = GetPhoto.getPhoto( conn, iNumPhoto );   
         System.out.println("imgData="+imgData);
         // display the image
         response.setContentType("image/gif");
         OutputStream o = response.getOutputStream();
         o.write(imgData);

         o.flush(); 
         o.close();
      }
      catch (Exception e)
      {
        e.printStackTrace();

      }
    }
         }
下面是getPhoto方法

public static byte[] getPhoto (Connection conn, int iNumPhoto)
throws Exception, SQLException
{
 String req = "" ;
 Blob img ;
 byte[] imgData = null ;
 Statement stmt = conn.createStatement ();

 // Query
 req = "Select image From visit";

 ResultSet rset  = stmt.executeQuery ( req ); 

 while (rset.next ())
 {    
  img = rset.getBlob(1);
  imgData = img.getBytes(1,(int)img.length());
 }    

 rset.close();
stmt.close();

 return imgData ;
}
visit表只有一条记录,但每当我执行调用servlet类imgData的jsp文件时,就会在每次刷新时打印不同的值,并且图像也不会显示在jsp上

  • 每次显示不同的值是编码错误或字节数组的特征
  • 为什么不显示图像帮助我解决问题

  • 您需要检查以下各项:

  • 在您的查询“SelectImagefromVisite”中,我没有看到限制结果的WHERE子句,因此如果您有许多行,这可能是每次刷新页面时获得不同结果的原因

  • 字段图像在数据库中的类型为BLOB

  • 编辑:

    查看MySQL的文档时,需要遵循一些规则。首先,该方法必须是getBytes而不是getBlob。其他规则包括:

    从Connector/J 3.1.0版开始,您可以使用 通过向JDBC URL添加属性Emulators=true来设置定位器。 使用此方法,驱动程序将延迟加载实际BLOB数据 直到您检索到其他数据,然后使用检索方法 (getInputStream()、getBytes()等)的数据流

    必须使用列别名,将列的值设置为实际值 BLOB的名称,例如:

    从blobtable中选择id“data”作为blob_数据,您还必须遵循 这些规则:

    SELECT只能引用一个表。这张桌子必须有一张桌子 主键

    SELECT必须将原始blob列名指定为别名 字符串,以替换名称

    SELECT必须覆盖构成主键的所有列

    BLOB实现不允许就地修改(它们是 由DatabaseMetaData.locatorsUpdateCopies()报告的副本 方法)。因此,请使用相应的 PreparedStatement.setBlob()或ResultSet.updateBlob()(对于 可更新结果集)方法将更改保存回数据库


    您可以在以下位置查看更多信息:

    您将从blob数据库中看到记录中的最后一个图像文件,因为byat数组会清除每个新记录,并将新图像文件替换到jsp页面中的固定位置。您需要将文件写入本地目录,并且需要提供该位置的路径。

    您需要确保正确解码Base64编码图像,并确保将图像添加到数据库的代码没有问题

    执行相反的过程:
    (1) 从数据库检索字节数组图像表示形式
    (2) 对字节数组执行Base64编码
    (3) 从Base64编码的字节数组创建字符串

    通过此操作获得的字符串必须与原始字符串具有相同的值: R0lGODlhDwAPAKECAAAAzMzM///waaacwaaaadwapaaaciispeqhsrz5modrlln48cxf8m2iq3ymmkqvlrtw4mlwach h09wdgltaxplzcbiesbvgvhzcbtbwfydfnhdmvyiqaow==


    如果是这样,那么您就知道您正确地执行了解码和数据库存储;否则,如果值不同,您需要修复解码或数据库存储代码。

    我已经提到,只有一行,因为我也使用where子句进行了测试,但随后删除了除1行之外的所有行进行测试。因此,只有一行,数据类型为BLOBi。visit table中没有主键。您能告诉我在上述文档中应该做什么吗现在我应该做什么更改您必须创建一个PK,如果您不想使用它们,您可以使用自动增量功能创建一个列“id”。如果您的数据在生产环境中,您可以使用PK创建一个临时表,然后从旧表加载数据,最后对表进行重命名。解码图像可能是图像无法正确显示在JSP中的原因。尝试将图像数据直接存储到db中,而不进行解码。@Ravindra Gullapalli您的意思是说我应该只将图像存储为base64字符串…这对我来说太低效了..首先我的数据库中只有一条记录..其次我尝试了fileoutputstream先将图像保存到驱动器..创建了一些9字节的文件,但不是其中的图像