2013-04-16 92 views
0
保存图像

我所要做的就是将图片插入MySQL表,然后获取图像数据(保存为BLOB类型),并把它写在某个文件位置的文件。如何阅读并从MySQL

到目前为止,我有下面的代码,从表中读取图像数据,并将其写为图像文件:

package imageReadWrite; 

import dbConnection.testConnection; 

import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.sql.*; 

public class BlobImageReadWeite { 
    testConnection db = new testConnection(); 

    public String GetImage() { 
     String result = ""; 
     try { 
      db.connect(); 
      System.out.println("this is for test connection"); 
      String Banner_chk = "Select * from banner_file where image_name is not null and status='Active' order by upload_dt DESC LIMIT 1"; 
      ResultSet rs_Banner_chk = db.execSQL(Banner_chk); 
      if (rs_Banner_chk.next()) { 
       System.out.println(rs_Banner_chk.getString("image_name")); 

       Blob blob = rs_Banner_chk.getBlob("image"); 
       File image = new File("test.png"); 
       FileOutputStream fos = new FileOutputStream(image); 

       byte[] buffer = new byte[1024]; 

       // Get the binary stream of our BLOB data 
       InputStream is = rs_Banner_chk.getBinaryStream("image"); 
       while (is.read(buffer) > 0) { 
        fos.write(buffer); 
       } 

       fos.close(); 
      } 

      db.close(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 

     return result; 
    } 

    public static void main(String[] args) { 
     BlobImageReadWeite obj1 = new BlobImageReadWeite(); 
     obj1.GetImage(); 
    } 
} 

的问题在于所生成的图像文件没有打开。

我插入图像到数据库使用下面的代码

package promocode; 
import java.awt.Toolkit; 
import java.io.*; 
import java.util.*; 
import java.util.Date; 
import java.text.*; 
import java.sql.*; 
import java.util.Vector; 
import javax.imageio.*; 
import javax.swing.ImageIcon; 
import java.awt.*; 


import db.connection; 



public class ImageReader { 
connection db=new connection(); 
public String fileupload(String flname,String user,String promo_rad)throws  IOException, SQLException,ParseException{ 

String line=null; 

String line1 = null; 
String fval = ""; 
String fval_temp = ""; 
String flog,fileflag; 
String sqlst1 = ""; 
String sqlst2 = ""; 
String res = "false"; 
int er_count=0; 
int cor_count=0; 
String error_message=""; 
String chk1=""; 
String chk2=""; 
String chk3=""; 
String chk4=""; 

System.out.println("the path is"+flname); 
System.out.println(promo_rad); 
String filename1=""; 
filename1=flname.substring(flname.lastIndexOf("\\")+1) ; 
System.out.println(filename1); 

try { 

Image img=Toolkit.getDefaultToolkit().getImage(flname); 
ImageIcon icon=new ImageIcon(img); 
int height=icon.getIconHeight(); 
int width=icon.getIconWidth(); 
System.out.println("the image height is "+height+" and the image width is "+width); 
File file = new File(flname); 
FileInputStream fs = new FileInputStream(file); 

db.connect(); 
if(width == 260 && height == 187){ 

sqlst2="insert into banner_file (image_name,image, FileType,Status, userid,image_flag,upload_dt,height,width) values ('"+filename1+"','"+fs+"','jpg','Active','"+user+"','"+promo_rad+"',now(),'"+height+"','"+width+"')"; 
System.out.println(sqlst2); 
db.updateSQL(sqlst2); 
res="true"; 
} 

    }catch(Exception e){ 
     System.out.println(e); 

    } 
finally{ 

db.close(); 
} 

return res; 


} 
    public static void main(String[] args) throws Exception { 
    // TODO Auto-generated method stub 

     ImageReader obj1=new ImageReader(); 
     String fn = "C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\aircel-billpay\\online_images\\Ganesha13.jpg"; 
     String result = obj1.fileupload(fn,"internalpromo","yes"); 
     System.out.println(result); 
} 

} 
+0

不知道这是一个问题,但你会写零到时的字节数读取文件小于缓冲区大小。我建议使用'ByteBuffer'和'FileChannel',但是你也可以解决这个问题,即记录读取的字节并使用其他的'write'方法。 –

+0

嗨,什么你与你的博客的对象做什么,我觉得你不是在写对象,它是从数据库中提取到新的文件对象即博客对象 – Brijesh

+0

嗨Brijesh我读是从数据库中读取输入流中的数据写在文件中。 – user251287

回答

1

试换

InputStream is = rs_Banner_chk.getBinaryStream("image"); 

InputStream is = blob.getBinaryStream("image"); 
0

is.read(buffer)返回的值表示多少字节读取,这可能不是buffer的整个长度。您忽略了返回的值,并且在每个循环迭代中写出buffer的全部内容。如果您检查文件的大小,您可能会发现它大于数据库中二进制数据的大小。

不是文件和FileOutputStream中,考虑使用的java.nio.file包代替:

Path image = Paths.get("test.png"); 
Files.copy(rs_Banner_chk.getBinaryStream("image"), image);