2017-11-12 5 views
-1

こんにちはみんな车内uがやって:BLOBのmysqlでバイト[]をアップロードしているようですが、なぜですか?

イムをmysqlの行ににenctype = "multipart/form-データ" を介して画像をアップロードしようとすると、Imは奇妙な結果を得る:

JavaのJSP画像を表示します:

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

画像を表示するためのJava ViewImageサーブレット方法:

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"); 
    } 



} 
TXTファイルiは、以下の内容を取得として、私は、MySQLからBLOBファイルを保存すると

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(); 
... 

} 

:画像をアップロードする

    <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> 

そしてaddeventサーブレット・コード:画像をアップロードする

JavaのJSP:

[[email protected] 
[[email protected] 
... 

私がtxtとして保存すると私はいくつかの文字を取得します...このコードでは、画像をアップロードしてsrcで見ることができません。私は間違って何をしているのかわかりませんが、これはうまくいきません...

ありがとうございます!

+0

'のResultSet RSを= bd.exQueryは(+ id' < "ID = EventosのSELECT * FROM" - - SQLインジェクションが起こるのを待っています... – fge

+0

@fge私はSQLインジェクションがそこで起こる可能性があることを知っていますが、これは生産に置かれないので気にしません。 –

+0

@RomanC私はdata.toString()同じ結果です –

答えて

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

問題はここにあります。あなたはbyte[].toString()を呼び出し、[[email protected]のような結果をもたらすSQL文字列の連結を行っています。あなたは、引数マーカーでプリペアドステートメントを使用して、準備されたステートメントに引数を経由してBLOBを提供する必要があります。

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

ありがとうございます@EJP <3 –

+0

モラル:SQL連結を使用しないでください。すべての種類の落とし穴が潜んでいます。 – EJP

関連する問題