【问题标题】:Uploading byte[] in BLOB mysql seems chopped up, why?在 BLOB mysql 中上传 byte[] 似乎中断了,为什么?
【发布时间】:2018-04-24 22:46:21
【问题描述】:

大家好,你们好吗:

我试图通过 enctype="multipart/form-data" 将图像上传到 mysql 行并且我得到奇怪的结果:

Java JSP 查看图片:

 <a href="viewevent?id=<%= viewevent.getId()%>">
    <img alt="" class="img-responsive image1" src="ViewImage?id=<%= viewevent.getId() %>">
 </a>

查看图像的Java ViewImage servlet 方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String id = request.getParameter("id");

    DataAccess bd = new DataAccess();
    bd.openConnection();
    ResultSet rs = bd.exQuery("SELECT * FROM eventos WHERE id="+id , "SELECT");

    try{
        while(rs.next()){
            response.setContentType("image/png");
            System.out.println(rs.getBytes("foto"));
            response.getOutputStream().write(rs.getBytes("foto"));

            response.reset();
            response.setContentType("image/png");
            // Write image content to response.
            response.getOutputStream().write(rs.getBytes("foto"));
        }
        bd.closeConnection();
    }catch(Exception e){
        System.out.println("Error cogiendo foto");
    }



}

Java JSP 上传图片:

                    <form action="addevent" method="post" enctype="multipart/form-data">
                        ...
                        <div class="form-group">
                            <label for="foto">Image</label>
                            <input name="foto" id="imagen" type=file accept=".jpg, .jpeg, .png">                                 
                        </div>                          
                       ...
                    </form>

并添加event servlet代码来上传图片:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    ...
    Part foto = request.getPart("foto");
    ...
    byte[] data = new byte[(int) foto.getSize()];
    foto.getInputStream().read(data, 0, data.length);

    bd.exQuery("UPDATE eventos SET foto = '"+data+"' WHERE titulo='"+titulo+"';", "UPDATE");
    bd.closeConnection();
...

}

当我将 BLOB 文件从 MySQL 保存为 txt 文件时,我得到以下内容:

[B@2a83de12 
[B@3d00eeab
...

正如您所见,当我将它们另存为 txt 时,我只会得到一些字符...使用此代码我无法上传图像并在 src 上查看它们。我不知道我做错了什么,但这不会起作用......

提前致谢!

【问题讨论】:

  • ResultSet rs = bd.exQuery("SELECT * FROM eventos WHERE id="+id
  • @fge 我知道那里可能会发生 SQL 注入,但这不会投入生产,所以我不介意。
  • @RomanC 我试图将其替换为 data.toString() 但我得到了相同的结果

标签: java mysql jdbc blob


【解决方案1】:
bd.exQuery("UPDATE eventos SET foto = '"+data+"' WHERE titulo='"+titulo+"';", "UPDATE");

问题就在这里。您正在执行 SQL 字符串连接,它调用 byte[].toString(),产生类似 [B@2a83de12 的结果。您应该使用带有参数标记的准备好的语句,并通过参数向准备好的语句提供 BLOB:

PreparedStatement ps = conn.prepareStatement("UPDATE eventos SET foto = ? WHERE titulo=?");
ps.setObject(1, data);
ps.setObject(2, titulo);
int rowCount = ps.executeUpdate();

【讨论】:

  • 道德:不要使用 SQL 连接。曾经。各种陷阱都潜伏在其中。 “不用于生产”并没有改变这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2018-11-09
相关资源
最近更新 更多