数据库的表是:
create table vvb(id int auto_increment primary key,name varchar(255),image mediumblob);
Java中代码:
public class de {
JFrame jf=new JFrame("图片管理程序");
private static Connection con;
private static PreparedStatement insert;
private static PreparedStatement query;
private static PreparedStatement queryAll;
private DefaultListModel imageModel=new DefaultListModel();
private JList imageList = new JList(imageModel);
private JTextField filePath=new JTextField(26);
private JButton browserBn=new JButton("...");
private JButton uploadBn=new JButton("上传");
private JLabel imageLabel=new JLabel();
JFileChooser chooser=new JFileChooser(".");
ExtensionFileFilter filter =new ExtensionFileFilter();
static 
{
try
{
Properties pro=new Properties();
pro.load(new FileInputStream("H:/1.txt"));
String driver=pro.getProperty("driver");
String url=pro.getProperty("url");
String user=pro.getProperty("user");
String pass=pro.getProperty("pass");
Class.forName(driver);
con=DriverManager.getConnection(url,user,pass);
insert=con.prepareStatement("insert into vvb values(null,?,?);");
query=con.prepareStatement("select image from vvb where id=?;");
queryAll=con.prepareStatement("select id,name from vvb;");

}catch(Exception e)
{
e.printStackTrace();
}
}
public void init() throws SQLException
{
filter.add("jpg");
filter.add("jgeg");
filter.add("gif");
filter.add("png");
filter.setDescription("图片文件(*.jpg,*.jpeg,*.gif,*.png)");
chooser.addChoosableFileFilter(filter);
chooser.setAcceptAllFileFilterUsed(false);
fillListModel();
filePath.setEditable(false);
imageList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JPanel jp=new JPanel();
jp.add(filePath);
jp.add(browserBn);
browserBn.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent e) {
int result = chooser.showDialog(jf, "浏览图片文件上传");
if(result == JFileChooser.APPROVE_OPTION)
{
filePath.setText(chooser.getSelectedFile().getPath());
}
}

});
jp.add(uploadBn);
uploadBn.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent e) { if(filePath.getText().trim().length() >0)
{
upload(filePath.getText());
filePath.setText("");
}
}

});

JPanel left = new JPanel();
left.setLayout(new BorderLayout());
left.add(new JScrollPane(imageLabel),BorderLayout.CENTER);
left.add(jp,BorderLayout.SOUTH);
jf.add(left);
imageList.setFixedCellWidth(160);
jf.add(new JScrollPane(imageList),BorderLayout.EAST);
imageList.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount() >=2)
{
ImageHolder cur=(ImageHolder)imageList.getSelectedValue();
try
{
showImage(cur.getId());
}catch(SQLException sql)
{
sql.printStackTrace();
}


}
}
});
jf.setSize(620,400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);

}
public void fillListModel()throws SQLException
{
ResultSet rs=null;
try
{
imageModel.clear();
rs=queryAll.executeQuery();
while(rs.next())
{
imageModel.addElement(new ImageHolder(rs.getInt(1),rs.getString(2)));
}
}finally
{
if(rs!=null)
{
rs.close();
}
}
}
public void upload(String fileName)
{
InputStream is =null;
byte[] bb=new byte[255];
try
{
String imageName = fileName.substring(fileName.lastIndexOf('\\')+1,fileName.lastIndexOf('.'));
System.out.println(imageName);
insert.setString(1, imageName);
File f=new File(fileName);
is=new FileInputStream(f);
insert.setBinaryStream(2,is,(int)is.available());
int affect = insert.executeUpdate();
if(affect == 1)
{
fillListModel();
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
try
{
if(is!=null)
{
is.close();
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
public void showImage(int id) throws SQLException
{
ResultSet rs=null;
try
{
query.setInt(1, id);
rs=query.executeQuery();
if(rs.next())
{
Blob imageBlob=rs.getBlob(1); 
ImageIcon icon=new ImageIcon(imageBlob.getBytes(1L,(int)imageBlob.length()));
imageLabel.setIcon(icon);

}
}finally
{
if(rs != null)
{
rs.close();
}
}
}
public static void main(String[] args)throws SQLException
{
new de().init();
}
class ExtensionFileFilter extends FileFilter
{
private String description="";
private ArrayList<String> extensions = new ArrayList<String>();
public void add(String extension)
{
if(!extension.startsWith("."))
{
extension="."+extension;
extensions.add(extension.toLowerCase());
}
}
public void setDescription(String description)
{
this.description=description;
}

@Override
public boolean accept(File f) {
if(f.isDirectory())
{
return true;
}
String name=f.getName().toLowerCase();
for(String extension:extensions)
{
if(name.endsWith(extension))
{
return true;
}
}
return false;
} @Override
public String getDescription() {
return description;
}

}
}
class ImageHolder
{
private int id;
private String name;
public ImageHolder()
{}
public ImageHolder(int id,String name)
{
this.id=id;
this.name=name;
}
public void setId(int id)
{
this.id=id;
}
public int getId()
{
return id ;
}
public void setString(String name)
{
this.name=name;
}
public String getString()
{
return name;
}
public String toString()
{
return name;
}
}

解决方案 »

  1.   

    数据库里还是存放图片的地址好些
    当然你也可以使用Blob存储图片
      

  2.   

    建议最好还是放路径,mysql没试过,之前在做项目的时候,在SQL Server中保存过。读写方式都是使用流的。但是在查询的时候奇慢,当时数据量貌似也不大的1W条数据左右。
      

  3.   

    呵呵,怎么都建议存地址,不觉得太投机取巧?很明显许多场合,图片的路径可能是某个网络URL,也可能是某个客户端本地的,会变的。
      

  4.   

    每个数据库厂商处理二进制文件(包括图片文件)的blob方式和API都不一样,你这样放移植性很差,而且读写数据库比直接读写磁盘要慢,从效率各方面考虑,图片最好是放在服务器特定目录,库表中一个字段指明存放路径,你可以通过文件名来定义一些更详细信息,比如时间戳等等
      

  5.   

    用流,建立一个file,之后接入流,再用preparestatement的setblob
      

  6.   

    类似的问题说过很多遍了,大量文件存在db里的增删操作,时间长了 会造成大量的碎片 严重影响性能,而且也没法对其建立索引。db里存文件,'能不能' 和 '好不好' 是两回事。
      

  7.   

    有必要吗!用相对路径的方式,如果在project目录下,re deploy一下就全over了;不在project目录,谁能保证他们的相对路径不变?
    文件存数据库就是一种现实存在的需求,这才是帖子的本意。