如何在java中获取数据库中的svg

Posted

技术标签:

【中文标题】如何在java中获取数据库中的svg【英文标题】:How to get svg in database injava 【发布时间】:2021-09-06 16:48:13 【问题描述】:

我有 1 个问题。我将 SVG 图像作为二进制文件保存在数据库中。现在,我想下载它而不转换为base64,有什么办法吗?谢谢。

【问题讨论】:

欢迎来到***。你的问题有几个问题,很难回答。 1)你没有提供任何细节:你使用什么样的数据库?你如何访问你的数据库(你使用休眠还是直接访问)?你用的是什么版本的java? ... 2)您已经尝试过什么?您没有提供任何源代码。 3)不要使用不相关的标签!你为什么用SpringPDFBox标记你的问题?请提供更多详细信息或删除标签! 【参考方案1】:

基本上,这意味着从数据库中获取BLOB 对象。 我会按照这种方法直接在浏览器中显示它:


@RestController
public class ImageController 

    @GetMapping(value = "/img-test", produces = "image/svg+xml")
    public byte[] getImg() throws IOException
    
        // retrieve your image from the DB
        File imgFile = new File("C:\\Users\\USR\\Desktop\\img.svg");

        InputStream inp = new DataInputStream(new FileInputStream(imgFile));

        return inp.readAllBytes(); // This is a Java 9 specific convertion
    

使用这种方法,您不会更改 BLOB 图像上的任何内容。你拿走它并按原样返回,arraybytes。您可以直接在浏览器中显示或将其嵌入 html 文件中的某个位置。

这里主要是MIME类型:image/svg+xml

如果您使用的是旧版 Java,请检查 this question 以了解 InputStream 对象到 byte 数组的转换。

通过这种方法,您可以下载文件:

@GetMapping("download-img")
    public ResponseEntity downloadImg() throws IOException
    
        // Get the file from the DB...
        File imgFile = new File("C:\\Users\\USR\\Desktop\\img.svg");

        InputStream inp = new DataInputStream(new FileInputStream(imgFile));
        //Dynamically change the File Name here
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"img.svg\"")
                .body(inp.readAllBytes());
    

【讨论】:

我可以获取字节,但我想要的输出是 svg 图像。 是在浏览器中显示还是下载? @gin 我用关于在浏览器中显示它的正确实现更新了答案。我测试了它,它可以工作......祝你好运! 我必须把它拿出来用 pdfbox 绘制 pdf 文件。对我来说真的很难 那么请说清楚一点,我花了时间和精力给你带来了一些东西......你说你想要一个SVG图像,你明白了......你必须使用现在逻辑将此图像与 pdfbox 一起使用。您可以将文件保存在临时文件夹中并从那里访问它们。或者您可以将图像输入为字节数组,应该可以使用 pdf 库。

以上是关于如何在java中获取数据库中的svg的主要内容,如果未能解决你的问题,请参考以下文章

如何使用SVG + XML数据设置IMG src?

如何在 IE 11 中的 Image.load 上获取 SVG 的宽度和高度

如何获取 svg:g 元素的宽度

如何从另一个数组中的数组中获取数据,该数组在 Java 中存储值?

如何在 Pentaho 数据集成 (Kettle) 中的“用户定义的 Java 类”步骤中获取所有参数

在渲染之前获取 SVG 中的文本宽度