实现向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中储存图片文件:
2 下代码实现从MYSQL中获取图片文件并写入本地文件系统:
Jegg 原创 摘自http://www.JavaResearch.com
一些情况下,需要向数据库中存储一些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中储存图片文件:
1
private final String insertquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";
2
3
4
5
public 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, 0, 0, null);
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
61
pre.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
private final String insertquery = "insert into employeephoto (Employee_ID,Binary_Photo,LastMod,Created) values (?,?, NOW(), NOW())";2

3
4

5
public 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, 0, 0, null);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

61
pre.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中获取图片文件并写入本地文件系统:
1
private 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
private 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 disk6

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 streams44

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 blob69

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


浙公网安备 33010602011771号