在不同的网络服务器上部署 UI 和中间轮胎时,AWS S3 上传文件不起作用,但在 localhost SpringBoot 中起作用

Posted

技术标签:

【中文标题】在不同的网络服务器上部署 UI 和中间轮胎时,AWS S3 上传文件不起作用,但在 localhost SpringBoot 中起作用【英文标题】:AWS S3 uploading file does not work when deployed UI and middle tire on different network servers but works in localhost SpringBoot 【发布时间】:2022-01-09 15:06:44 【问题描述】:

上图显示了我的应用程序部署的结构.. Spring Boot 应用程序具有以下 aws 配置。

应用程序正在本地运行。我可以将文件写入 s3 存储桶。 当我将代码部署在不同的服务器上时,如上图所示。它无法编写 s3 存储桶 显示以下错误

Error while uploading the file to S3java.io.FileNotFoundException: sample.txt (Permission denied)"

注意:这些服务器位于不同的位置。

我该如何克服这个问题。 我有办法

    将上传文件写入 UI Server 文件夹并使用脚本上传 在 s3 任何人都有其他解决方案,请提出建议。

编辑 1: 1.我可以接收请求表单UI服务器。但请求中不存在文件 2.其他获取请求正在工作 编辑 2

控制器

 @PostMapping("/request")
    ReturnStatus saveRequest(HttpServletRequest request,
                             
                             @RequestParam(value = "file", required = true)
                                     MultipartFile uploadedFile) throws InvalidInputException 
        AuthDto auth = (AuthDto) request.getAttribute(AUTH_DTO);
        return requestService.saveRequest(
                new RequestParams( uploadedFile));
    

服务类逻辑

File uploadFile = convertMultiPartToFile(params.getLookUpValues());
            s3ClientBuilder.build().putObject(new PutObjectRequest(s3BucketName, fileName, uploadFile));

public static File convertMultiPartToFile(MultipartFile file) throws IOException 
        File convFile = new File(file.getOriginalFilename());
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
       

编辑 3

在 UI 服务器 tomcat 中创建一个临时文件夹

一旦我点击上传文件保存到临时和请求去弹性 beantalk 并保存元数据。

How the s3 bucket file upload work?
Need to write any separate script? if yes how its trigger

如有错误请指正

【问题讨论】:

您能否检查一下您是否在 Spring Boot 中正确接收了文件。从异常看来,这不是 s3 问题,而是文件本身没有得到解决。 这是正确的。否则我不会在本地工作 请发布您的 spring-boot 代码。您是先在本地保存文件,然后再尝试上传吗?如果是这种情况,在 EB 中您需要正确配置对本地文件系统的访问。 @kgiannakakis 添加。 【参考方案1】:

默认为 /tmp 的目录有一些 spring-boot 属性。您的 EB 用户将无权访问此文件夹。这些设置允许我们在 Elastic Beanstalk 环境中通过 Spring Boot 使用分段上传:

server.tomcat.basedir: $user.dir
spring.http.multipart.location: $user.dir\

错误可能来自这一行:

File convFile = new File(file.getOriginalFilename());

您正在尝试将文件保存在基本目录中,但您无权访问它。遵循上述建议。或者,阅读此question,了解如何正确创建 tmp 文件夹。

【讨论】:

server.tomcat.basedir-> 这将是 UI Server tomcat 的位置,对吧? 是的,适用于嵌入式 tomcat。请参阅 docs.spring.io/spring-boot/docs/current/reference/html/… 和 docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/…。您需要将多部分位置设置为您有权访问的文件夹。 @kgiannakakis 你能解释一下上传请求的流程 请同时发布您的 convertMultiPartToFile 方法的代码。您可能正在临时位置创建文件。在本地您可以访问,但在 EB 中没有。 @kgiannakakis 添加

以上是关于在不同的网络服务器上部署 UI 和中间轮胎时,AWS S3 上传文件不起作用,但在 localhost SpringBoot 中起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 TFS 中的 Web 部署在不同的网站上部署多个 Web 应用程序

汽车转弯时,两侧车轮转速不同?怎么解决问题?

消耗品应用内购买是不是适用于不同的轮胎?

NFS存储服务部署(上)

在网络上部署Corda节点时,哪些JAR必须完全相同?

acwing是啥轮胎