对url上没有后缀的svg图标的处理

对url上没有后缀的svg图标的处理

最后修改时间:7 months ago

# 问题描述

在做中转系统的时候,提供的图标地址为内网地址需要中转站将url 转为外网可以访问的图标,而提供给中转站的图标url不带图标名称 与后缀,直接转存后为二进制文件,文件打开后,末尾多了一串null。 导致于浏览器无法识别该svg文件

如下图所示

打开后显示 java-svg-1618995999300

浏览器中显示 java-svg-1618996030300

# 解决方案

思路

  1. 先通过url拿到文件流(svg图片的文件流)
  2. 将文件流通过字符串的方式输出
  3. 再将字符串转为svg文件保存
  4. 通过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

效果图

java-svg-1618996761300

- 全文完 -

留下一条留言?
默认颜色

主题颜色

标准颜色

更多颜色...