当前位置: 首页 > 知识库问答 >
问题:

从S3下载Thymeleaf模板

姜鸿畴
2023-03-14

我目前正在S3中存储和下载我的Thymeleaf模板。

我使用以下函数从S3检索模板:

    public String getTemplateFile(String name, File localFile) {

    ObjectMetadata object = s3Client.getObject(new GetObjectRequest(connectionProperties.getBucket(), name), localFile);

    boolean success = localFile.exists() && localFile.canRead();

    return localFile.getPath();

}

执行此操作后,文件将成功下载到所需位置。

但是当试图从FlyingSaucer PDF生成器访问文件时,该文件不存在,尽管它已经在FILE_LOCATION_PATH下载。(我可以打开文件...文件在那里,但函数看不到它)

 String xHtmlStringDocument =
            convertHtmlToXhtml(templateEngine
                    .process(FILE_LOCATION_PATH,
                            initializeLetterHtmlTemplateContext(letter)));

当我一次又一次地运行程序时,我得到了相同的结果。但是当我停止程序并再次运行它时,一切都正常,因为程序现在可以识别上次执行的文件。

这听起来像是一个异步函数问题。

有人知道我该怎么解决这个问题吗?

提前谢谢。

编辑(以下建议)

新函数:相同的结果:(创建了文件,从S3下载成功)

Java语言io。FileNotFoundException:无法解析ClassLoader资源“static/templates/template.html”

    public String getTemplateFileN(String name, File localFile) throws IOException {
    S3Object fullObject = null;
    InputStream in = null;
    try {
        fullObject = s3Client.getObject(new GetObjectRequest(connectionProperties.getBucket(), name));

        System.out.println("Content-Type: " + fullObject.getObjectMetadata().getContentType());
        System.out.println("Content: ");
        displayTextInputStream(fullObject.getObjectContent());
        in = fullObject.getObjectContent();
        System.out.println(localFile.toPath());
        Files.copy(in, localFile.toPath());

    }   //then later
    finally {
        // To ensure that the network connection doesn't remain open, close any open input streams.
        if (fullObject != null) {
            fullObject.close();
        }
        if (in != null) {
            in.close();
        }
    }

    return localFile.getPath();

}

共有1个答案

秦俊豪
2023-03-14

正在检查javadochttps://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject-com。亚马逊。服务。s3.型号。GetObjectRequest java。io。文件-

我看不到方法签名ObjectMetadata getObject(GetObjectRequest GetObjectRequest,String file)

那里有

ObjectMetadata getObject(GetObjectRequest getObjectRequest,
                                File destinationFile)

您提供File(不是String)作为第二个参数的地方。在尝试读取文件之前,请确保文件没有打开以供写入!

 类似资料:
  • 运行上述代码后出现以下错误。请帮忙做这件事。。正在将源和目标文件名作为S3属性中的参数传递。。。 在处理上述异常时,发生了另一个异常: 回溯(最后一次调用):文件“C:\Cloudtail\CT\SQL Scripts\python\GRN\u S3\u dwnld.py”,第17行,除了botocore.exception.ClientErrors as e:NameError:未定义名称“bo

  • 我已使用IAM角色启动了一个ec2实例,并将以下策略与IAM角色关联。 然而,当我试图从ec2-实例中使用aws cli下载文件时,我一直拒绝访问。 当我模拟策略并对bucket中的对象执行操作时,会收到消息“allowed”。当我访问时,我可以看到正确的实例配置文件附在实例上http://169.254.254/latest-metadata/iam/info 我有什么明显的遗漏吗?

  • 根据AWS文档中提供的资源,可以通过以下代码下载对象: 编辑 我将更改为,它打开了pdf,但现在我需要下载它

  • 问题内容: 我在s3中有一个存储桶,它具有深层的目录结构。我希望我可以一次全部下载它们。我的文件如下所示: 有什么方法可以使用python中的boto lib从s3存储桶中递归下载这些文件? 提前致谢。 问题答案: 您可以按以下方式在存储桶中下载所有文件(未经测试): 请记住,S3中的文件夹只是写密钥名的另一种方法,只有客户端会将其显示为文件夹。

  • 我在Rails中有一个简单的应用程序,它允许我使用Carrierwave和fog将文件上传到AmazonS3。它很好用。我现在正在下载文件并在浏览器上显示它们。它起作用了。然而,来自S3的私有链接(我将其设置为临时链接)显示在浏览器上,如: https://xxx.s3-ap-southeast-1.amazonaws.com/uploads/resume/attachment/4/xxx.pdf

  • 我正在使用SpringBoot和thymeleaf从html模板生成文档。 随着模板的不断变化,我希望ti从外部加载模板,只是从外部添加或删除模板,而不是重新部署应用程序。 作为POC,使用/resources文件夹时效果良好。 这就是错误: 解析模板“凭证”时出错,该模板可能不存在,或者任何已配置的模板解析程序都无法访问该模板 这就是背景: applycation.yml 这是我的方法:其中te