Récupérez les fichiers sous les ressources de Springboot

1 Description du problème

Ce qui suit fait partie du code pour l'exportation PDF, principalement pour obtenir les fichiers de polices sous ressources. Les fichiers de polices sont placés dans le répertoire /static/fonts sous ressources. L'idée initiale est d'obtenir d'abord le répertoire où se trouvent les fichiers de polices, puis d'obtenir les fichiers dans le répertoire. Le code principal est le suivant :

   /**
     * 构建字体
     */
    private static ConverterProperties buildConvertProperties() throws IOException {
    
    
        ConverterProperties converterProperties = new ConverterProperties();
        // 获取字体文件路径
        File fontsDirectory = getClassPathStaticFile(ExportConfig.getFontPath());
        if (!ObjectUtils.isEmpty(fontsDirectory)) {
    
    
            // 获取字体文件
            File[] fontFiles = fontsDirectory.listFiles();
            FontProvider fontProvider = new FontProvider();
            if (fontFiles != null && fontFiles.length != 0) {
    
    
                for (File file : fontFiles) {
    
    
                    FontProgram fontProgram = FontProgramFactory.createFont(file.getAbsolutePath(), true);
                    fontProvider.addFont(fontProgram);
                }
                converterProperties.setFontProvider(fontProvider);
            }
        }
        return converterProperties;
    }

   /**
     * 获取字体文件路径
     */
    public static File getClassPathStaticFile(String classPath) throws FileNotFoundException {
    
    
        try {
    
    
            ClassPathResource classPathResource = new ClassPathResource(classPath);
            return classPathResource.getFile();
        } catch (Exception e) {
    
    
            log.error("获取字体路径错误:" + classPath, e);
            throw new FileNotFoundException("字体获取失败");
        }
    }

En idée, le répertoire des polices peut être obtenu normalement. Si elle est appelée après l'empaquetage, une erreur FileNotFoundException sera signalée. En effet, Spring essaie d'accéder au chemin du système de fichiers après l'empaquetage, mais ne peut pas accéder au chemin dans le JAR.

2023-03-07 17:30:21.602 [http-nio-8085-exec-4] ERROR com.cbex.partyconstruction.common.PdfExportUtil - 获取字体路径错误:/static/fonts
java.io.FileNotFoundException: class path resource [static/fonts] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/E:/zhdjtest/zhdj/boot/zhdj.jar!/static/fonts
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
        at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:154) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
        at com.cbex.partyconstruction.common.PdfExportUtil.getClassPathStaticFile(PdfExportUtil.java:115) [zhdj.jar:?]
        at com.cbex.partyconstruction.common.PdfExportUtil.buildConvertProperties(PdfExportUtil.java:92) [zhdj.jar:?]
        at com.cbex.partyconstruction.common.PdfExportUtil.exportPdfToClient(PdfExportUtil.java:79) [zhdj.jar:?]
        at com.cbex.partyconstruction.common.PdfExportUtil.exportPdfToClient(PdfExportUtil.java:49) [zhdj.jar:?]

2 solutions

2.1 Chemin complet du fichier de configuration

Lisez les informations sur le fichier via le chemin complet du fichier (chemin absolu). Le code est modifié comme suit :

   /**
     * 构建字体
     */
    private static ConverterProperties buildConvertProperties() throws IOException {
    
    
        ConverterProperties converterProperties = new ConverterProperties();
        // 获取字体文件路径
        File fontsDirectory = getClassPathStaticFile(ExportConfig.getFontPath());
        if (!ObjectUtils.isEmpty(fontsDirectory)) {
    
    
            // 获取字体文件
            File[] fontFiles = fontsDirectory.listFiles();
            FontProvider fontProvider = new FontProvider();
            if (fontFiles != null && fontFiles.length != 0) {
    
    
                for (File file : fontFiles) {
    
    
                    FontProgram fontProgram = FontProgramFactory.createFont(file.getAbsolutePath(), true);
                    fontProvider.addFont(fontProgram);
                }
                converterProperties.setFontProvider(fontProvider);
            }
        }
        return converterProperties;
    }

   /**
     * 获取字体文件路径
     */
    public static File getClassPathStaticFile(String classPath) throws FileNotFoundException {
    
    
        try {
    
    
            // classPath为磁盘的绝对路径
            return new File(FileUtil.getAbsolutePath(classPath));
        } catch (Exception e) {
    
    
            log.error("获取字体路径错误:" + classPath, e);
            throw new FileNotFoundException("字体获取失败");
        }
    }
  • Placez le fichier directement sur le serveur cible et définissez le chemin de la police dans le fichier de configuration sur un chemin absolu.
  • Utilisez maven-assembly-plugin pour regrouper les fichiers dans un package tar, mais pas dans un package jar. Le chemin de la police est également défini sur un chemin absolu dans le fichier de configuration. Par rapport à la méthode précédente, cela permet d'éviter de manquer des fichiers de polices lors du déploiement.
       // 在assembly.xml文件中配置以下信息
       <fileSet>
            <directory>${
    
    basedir}/target/classes/static/fonts</directory>
            <outputDirectory>static/fonts</outputDirectory>
            <fileMode>0755</fileMode>
        </fileSet>

2.2 Utilisation des flux de fichiers

Utilisez le flux de fichiers pour obtenir.

  • Avantages : Les fichiers de polices se trouvent dans le package jar et le package packagé peut être exécuté indépendamment sans avoir besoin de fichiers externes.
  • Inconvénients : Cette méthode nécessite de configurer des noms de fichiers spécifiques. S'il y a beaucoup de fichiers, ce sera peu convivial.
    /**
     * 构建字体
     */
    private static ConverterProperties buildConvertProperties() throws IOException {
    
    
        ConverterProperties converterProperties = new ConverterProperties();
        // 获取字体文件名
        List<String> fontName = ExportConfig.getFontName();
        // 获取字体文件所在目录
        String fontPath = ExportConfig.getFontPath();
        FontProvider fontProvider = new FontProvider();
        if (CollUtil.isNotEmpty(fontName)) {
    
    
            for (String name : fontName) {
    
    
                // 获取文件流
                InputStream stream = PdfExportUtil.class.getClassLoader ().getResourceAsStream(StrUtil.format(FONT_PATH_NAME, fontPath, name));
                assert stream != null;
                final byte[] bytes = IOUtils.toByteArray(stream);
                FontProgram fontProgram = FontProgramFactory.createFont(bytes, true);
                fontProvider.addFont(fontProgram);
            }
            converterProperties.setFontProvider(fontProvider);
        }
        return converterProperties;
    }

おすすめ

転載: blog.csdn.net/weixin_46505978/article/details/129658024