svg文件转标签形式(字符串)。MultipartFile转File

1 篇文章 0 订阅
1 篇文章 0 订阅

svg文件转标签形式(字符串)。MultipartFile转File

对于svg矢量图的处理,一般可能是存文件形式,但如果只是很少量的,也可直接存数据库:
利用batik既可:

		<dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-all</artifactId>
            <version>1.14</version>
            <type>pom</type>
        </dependency>
import org.apache.batik.anim.dom.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
public class SvgUtil {
    /**
     * 解析svg
     *
     * @param file svg 文件
     */
    public static String analysisOfSVG(File file) throws IOException {
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
        Document doc = f.createDocument(file.toURI().toString());
		//这里直接获取全部,也可以获取部分
        Element element = doc.getDocumentElement();
        return transformationSVG(element);
    }

    /**
     * 将标签转换成字符串
     *
     * @param element {@link Element}
     */
    public static String transformationSVG(Element element) {
        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer = null;
        try {
            transformer = transFactory.newTransformer();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
        StringWriter buffer = new StringWriter();
        assert transformer != null;
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        try {
            transformer.transform(new DOMSource(element), new StreamResult(buffer));
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }
}

doc.getDocumentElement();这里是直接获取了整个所有标签,获取出来大概是这样:(也可以根据名称或者id获取其中某个标签的内容)

<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>编组</title>
    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g id="1-首页" transform="translate(-112.000000, -585.000000)">
            <g id="content" transform="translate(88.000000, 300.000000)">
                <g id="Table-表格备份-10" transform="translate(0.000000, 266.000000)">
                    <g id="预警" transform="translate(16.000000, 15.000000)">
                        <g id="编组" transform="translate(8.000000, 4.000000)">
                            <rect id="矩形" x="0" y="0" width="16" height="16"></rect>
                            <path d="M8.02245107,4.2962963 C10.1099932,4.2962963 11.8604801,5.98154751 11.9678469,8.04598504 L11.973064,8.2469092 L11.973064,13.1851852 L14.1728351,13.1851852 C14.4421954,13.1851852 14.6666667,13.4096565 14.6666667,13.6790167 C14.6666667,13.9184481 14.4893066,14.1224012 14.260713,14.1647682 L14.1728351,14.1728351 L1.82716488,14.1728351 C1.55780461,14.1728351 1.33333333,13.948377 1.33333333,13.6790167 C1.33333333,13.4395854 1.51069335,13.2356219 1.73928702,13.1932526 L1.82716488,13.1851852 L4.07182502,13.1851852 L4.07182502,8.2469092 C4.07182502,6.09202704 5.86756892,4.2962963 8.02245107,4.2962963 Z M8.02449208,7.14294938 L8.1224317,9.29782197 L6.3593463,9.54269972 L8.26935549,12.3342516 L7.97550792,10.1793647 L9.68962351,9.98347107 L8.02449208,7.14294938 Z M2.81481481,6.49606745 C3.08417508,6.49606745 3.30864636,6.72053872 3.30864636,6.98989899 C3.30864636,7.22933034 3.13128634,7.43329384 2.90269268,7.47566312 L2.81481481,7.48373053 L1.82716488,7.48373053 C1.55780461,7.48373053 1.33333333,7.25925926 1.33333333,6.98989899 C1.33333333,6.75046764 1.51069335,6.54650414 1.73928702,6.50413486 L1.82716488,6.49606745 L2.81481481,6.49606745 Z M14.1728351,6.49606745 C14.4421954,6.49606745 14.6666667,6.72053872 14.6666667,6.98989899 C14.6666667,7.22933034 14.4893066,7.43329384 14.260713,7.47566312 L14.1728351,7.48373053 L13.1851852,7.48373053 C12.9158249,7.48373053 12.6913536,7.25925926 12.6913536,6.98989899 C12.6913536,6.75046764 12.8687137,6.54650414 13.0973073,6.50413486 L13.1851852,6.49606745 L14.1728351,6.49606745 Z M12.4219934,2.94949495 C12.5791279,3.10661794 12.5987697,3.36686547 12.4809188,3.5497696 L12.4219934,3.62289562 L11.7485927,4.2962963 C11.5690236,4.52076757 11.2547743,4.52076757 11.075192,4.2962963 C10.918069,4.13917331 10.8984287,3.87892577 11.0162709,3.69602165 L11.075192,3.62289562 L11.7485927,2.94949495 C11.928175,2.76992582 12.2424242,2.76992582 12.4219934,2.94949495 Z M4.2680598,2.89057383 L4.34118529,2.94949495 L5.05948811,3.62289562 C5.23905724,3.80246475 5.23905724,4.11672717 5.01458596,4.2962963 C4.85746298,4.45341928 4.59722551,4.47305966 4.41431509,4.35521742 L4.34118529,4.2962963 L3.66778462,3.62289562 C3.48821549,3.44332649 3.48821549,3.12906408 3.66778462,2.94949495 C3.82491911,2.79237196 4.08515802,2.77273159 4.2680598,2.89057383 Z M8.02245107,1.33333333 C8.26188242,1.33333333 8.46583554,1.51069335 8.50820251,1.73928702 L8.51626947,1.82716488 L8.51626947,2.81481481 C8.51626947,3.08417508 8.29181134,3.30864636 8.02245107,3.30864636 C7.78301972,3.30864636 7.57905622,3.13128634 7.53668694,2.90269268 L7.52861953,2.81481481 L7.52861953,1.82716488 C7.52861953,1.55780461 7.7530908,1.33333333 8.02245107,1.33333333 Z" id="形状结合" fill="#FF2929"></path>
                        </g>
                    </g>
                </g>
            </g>
        </g>
    </g>
</svg>

当然前后端交互文件一般是MultipartFile。直接转File一下(记得删除临时文件deleteTempFile):

import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.nio.file.Files;
import java.util.Objects;

public class MultipartFileUtil {
    /**
     * MultipartFile 转 File
     *
     * @param file {@link MultipartFile}
     */
    public static File multipartFileToFile(MultipartFile file) {
        File toFile = null;
        try (InputStream ins = file.getInputStream()) {
            toFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
            inputStreamToFile(ins, toFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return toFile;
    }

    /**
     * 获取流文件
     */
    private static void inputStreamToFile(InputStream ins, File file) {
        try (OutputStream os = new FileOutputStream(file)) {
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除本地临时文件
     *
     * @param file File
     */
    public static void deleteTempFile(File file) throws IOException {
        Files.delete(file.toPath());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值