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());
}