YCOE

You Can't stOp mE!

导航

实现向MYSQL数据库中存储或提取图片文件

Posted on 2006-03-19 19:42  YCOE  阅读(4934)  评论(1编辑  收藏  举报
 实现向MYSQL数据库中存储或提取图片文件

 
一些情况下,需要向数据库中存储一些2进制文件,比如图片文件等,这时候,向数据库存储数据不同于普通的字符串存储,我们需要对这个2进制文件使用JAVA处理2进制流的API进行处理,然后再进行存储。我们需要进行以下步骤来实现:

 
向数据库中存储文件的时候,一样使用标准SQL语句,如: insert into database (column1, column2,..) values(v1,v2,…);注意的是,要在建立存放2进制文件的TABLE时,存放的字段要使用BLOB类型,而不是普通的VARCHAR等。BLOB是专门存储2进制文件的类型,他还有大小之分,比如mediablob,logblob等,以存储大小不同的2进制文件,一般的图形文件使用mediablob足以了。


1 见以下代码实现向MYSQL中储存图片文件:
 1private final String insertquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
 2
 3 
 4
 5public void doInsertStaffPic(String loginname,String source_URL) {
 6
 7 
 8
 9              Connection conn = null;
10
11              PreparedStatement pre = null;
12
13 
14
15              try {
16
17             // 进行数据库连接,这里我使用的是在STRUTS中配置的连接池,当然也可// 以自己通过JDBC直接连
18
19                     conn = DBProcess.getConnection();
20
21                     
22
23//从图片源中获得图片对象并写到缓存中
24
25                     Image image = new ImageIcon(source_URL).getImage();
26
27                     BufferedImage bImage = new BufferedImage(image.getWidth(null),
28
29                                   image.getHeight(null), BufferedImage.TYPE_INT_RGB);
30
31                     Graphics bg = bImage.getGraphics();
32
33                     bg.drawImage(image, 00null);
34
35                     bg.dispose();
36
37                     
38
39//将图片写入2进制的输出流 并放如到byte[] buf中
40
41                     ByteArrayOutputStream out = new ByteArrayOutputStream();
42
43                     ImageIO.write(bImage, "jpg", out);
44
45                     byte[] buf = out.toByteArray();
46
47                     
48
49            //获得这个输出流并将他设置到BLOB中
50
51                     ByteArrayInputStream inStream = new ByteArrayInputStream(buf);
52
53                     pre = conn.prepareStatement(insertstaffpicquery);
54
55                     pre.setString(1, loginname);
56
57                     pre.setBinaryStream(2, inStream, inStream.available());
58
59                     // 执行写如数据
60
61pre.executeUpdate();
62
63                     
64
65 
66
67              }
 catch (Exception exc) {
68
69                     exc.printStackTrace();
70
71              }

72
73 
74
75              finally {
76
77                     try {
78
79                            pre.close();
80
81                            conn.close();
82
83 
84
85                     }
 catch (SQLException e) {
86
87                            e.printStackTrace();
88
89                     }

90
91              }

92
93 
94
95       }

96
97

2 下代码实现从MYSQL中获取图片文件并写入本地文件系统:
  1private final String writeoutquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
  2
  3 
  4
  5// retrive the picture data from database and write it to the local disk
  6
  7       public void doGetAndShowStaffPic(String loginname, String dir) {
  8
  9 
 10
 11        FileOutputStream output = null;
 12
 13        InputStream input = null;
 14
 15 
 16
 17              Connection conn = null;
 18
 19              ResultSet rs = null;
 20
 21              PreparedStatement pre = null;
 22
 23 
 24
 25              try {
 26
 27                     conn = DBProcess.getConnection();
 28
 29                     pre = conn.prepareStatement(writeoutquery);
 30
 31                     pre.setString(1, loginname);
 32
 33                     rs = pre.executeQuery();
 34
 35 
 36
 37                     if (rs.next()) {
 38
 39                // 从数据库获得2进制文件数据
 40
 41                            Blob image = rs.getBlob("Binary_Photo");
 42
 43                            // setup the streams
 44
 45                            Input = image.getBinaryStream();
 46                   
 47
 48                            try {
 49
 50                    // 设置写出路径。
 51
 52                                   output = new FileOutputStream(dir);
 53
 54                            }
 catch (FileNotFoundException e1) {
 55
 56                                   
 57
 58                                   e1.printStackTrace();
 59
 60                            }

 61
 62                            // set read buffer size 注意不要设置的太小,要是太小,图片可能不完整
 63
 64                            byte[] rb = new byte[1024000];
 65
 66                            int ch = 0;
 67
 68                            // process blob
 69
 70 
 71
 72                            try {
 73
 74                   // 写入本地文件系统
 75
 76                                   while ((ch = input.read(rb)) != -1{
 77
 78                                          output.write(rb, 0, ch);
 79
 80                                          
 81
 82                                   }

 83
 84                                   
 85
 86                            }
 catch (IOException e) {
 87
 88                                   
 89
 90                                   e.printStackTrace();
 91
 92                            }

 93
 94                            
 95
 96                            try {
 97
 98                                   input.close();
 99
100                            }
 catch (IOException e) {
101
102                                   
103
104                                   e.printStackTrace();
105
106                            }

107
108                            try {
109
110                                   output.close();
111
112                            }
 catch (IOException e) {
113
114                            
115
116                                   e.printStackTrace();
117
118                            }

119
120 
121
122                     }

123
124 
125
126              }
 catch (SQLException e) {
127
128                     e.printStackTrace();
129
130              }

131
132 
133
134              finally {
135
136                     try {
137
138                            rs.close();
139
140                            pre.close();
141
142                            conn.close();
143
144 
145
146                     }
 catch (SQLException e) {
147
148                            e.printStackTrace();
149
150                     }

151
152              }

153
154       }

155
156


Jegg 原创  摘自http://www.JavaResearch.com