实现向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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

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