# 问题描述
在做中转系统的时候,提供的图标地址为内网地址需要中转站将url 转为外网可以访问的图标,而提供给中转站的图标url不带图标名称 与后缀,直接转存后为二进制文件,文件打开后,末尾多了一串null。 导致于浏览器无法识别该svg文件
如下图所示
打开后显示
浏览器中显示
# 解决方案
思路
- 先通过url拿到文件流(svg图片的文件流)
- 将文件流通过字符串的方式输出
- 再将字符串转为svg文件保存
- 通过springboot 访问静态文件
代码
/**
* 通过网络url取文件,并保存
*
* @param path 文件保存路径
* @param url 网络地址
*/
public static void uploadImage2(String path, String url) {
try {
// 获取网络文件流
URL pathUrl = new URL(url);
DataInputStream dataInputStream = new DataInputStream(pathUrl.openStream());
// 创建文件流
File file = new File(path);
// 判断需要保存的文件路径存在不存在,若不存在则创建
File file1 = new File("/app/application/hdrs/file/icon");
if (!file1.exists()) {
file1.mkdirs();
}
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
while (dataInputStream.read(buffer) > 0) {
fileOutputStream.write(buffer);//将buffer中的字节写入文件中区
}
dataInputStream.close();//关闭输入流
fileOutputStream.close();//关闭输出流
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
//将file文件内容转成字符串
BufferedReader bf = new BufferedReader(isr);
String content = "";
StringBuilder sb = new StringBuilder();
while (content != null) {
content = bf.readLine();
if (content == null) {
break;
}
sb.append(content.trim());
}
bf.close();
String fileStr = sb.toString();
string2File(fileStr,path);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 将字符串写入指定文件
*
* @param res 原字符串
* @param filePath 文件路径
* @return 成功标记
*/
public static boolean string2File(String res, String filePath) {
boolean flag = true;
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File distFile = new File(filePath);
if (!distFile.getParentFile().exists()) distFile.getParentFile().mkdirs();
bufferedReader = new BufferedReader(new StringReader(res));
bufferedWriter = new BufferedWriter(new FileWriter(distFile));
char buf[] = new char[1024]; //字符缓冲区
int len;
while ((len = bufferedReader.read(buf)) != -1) {
bufferedWriter.write(buf, 0, len);
}
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
flag = false;
return flag;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return flag;
}
1
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
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
效果图