Amazon web services Spring引导多部分文件上载大小不一致
我有一个端点,它将图像文件上传到服务器,然后再上传到S3 当我在localhost上运行时,MultipartFile字节大小正确,并且上传成功 但是,当我将其部署到EC2实例时,上载的文件大小不正确 控制器代码Amazon web services Spring引导多部分文件上载大小不一致,amazon-web-services,spring-boot,file-upload,aws-api-gateway,Amazon Web Services,Spring Boot,File Upload,Aws Api Gateway,我有一个端点,它将图像文件上传到服务器,然后再上传到S3 当我在localhost上运行时,MultipartFile字节大小正确,并且上传成功 但是,当我将其部署到EC2实例时,上载的文件大小不正确 控制器代码 @PostMapping("/{id}/photos") fun addPhotos(@PathVariable("id") id: Long, @RequestParam("file") file: MultipartFile,
@PostMapping("/{id}/photos")
fun addPhotos(@PathVariable("id") id: Long,
@RequestParam("file") file: MultipartFile,
jwt: AuthenticationJsonWebToken) = ApiResponse.success(propertyBLL.addPhotos(id, file, jwt))
在PropertyBLL.addPhotos
方法中,打印file.size会导致错误的大小
实际的文件大小是649305字节,但是当上传到我的prod服务器时,读取的是1189763字节
- 我的生产服务器是一个AWS EC2实例,支持Https李>
- Spring应用程序的yml文件是相同的。我覆盖的唯一配置是文件最大大小属性
- 我在用邮递员把请求寄出去。我将主体作为表单数据传递,键名为“file”李>
- 同样,在本地运行时,它也能完美地工作
EFBFBD50 4E470D0A 1A0A0000 000D4948 44520000 0300000002400802 000000 EF BFBDCC96 010000000467414D 410000EF BFBDFBF BD0BEBF BD610500 00002063 48524D0007A2600
原始文件的前n个字节:
89504E47 0D0A1A0A 0000000 D 49484452 00000 300 00000 240 080200000 00B5CC96 01000000 0467414D 410000B1 8F0BFC61 05000000 20634852 4D00007A 26000080 840000FA 00000080
它们中似乎都有文本“PNG”,并且还有结束EXtdate:modify/create标记
根据请求,addPhoto的核心内容如下:
val metadata = ObjectMetadata()
metadata.contentLength = file.size
metadata.contentType = "image/png"
LOGGER.info("Uploading image of size {} bytes, name: {}", file.size, file.originalFilename)
val request = PutObjectRequest(awsProperties.cdnS3Bucket, imageName, file.inputStream, metadata)
awsSdk.putObject(request)
当我在本地运行web服务器时,这就起作用了。imageName只是一个自定义生成的名称。还有其他一些代码涉及hibernate模型,但并不相关
更新
这似乎与Https/api代理相关。当我点击EC2节点的http url时,它工作正常。但是,当我通过api proxy()时,它将代理EC2节点,但失败了。我将继续沿着这条路走下去。对不起,许多评论毫无意义
file.size
将返回上传文件的大小(以字节为单位),而不是请求的大小(是的,由于不同的过滤器可能会通过附加信息和大小的增加而得到增强)。Spring不能神奇地将PNG文件的大小增加一倍(在您的情况下,在您发送的任何文件上再添加大约600kb的信息)。虽然我相信你知道你在做什么,你给我们的数字确实是正确的,但对我来说,所有证据都指向人为错误。。。请,双重,三重,四重-检查您是否确实在所有情况下上载相同的文件
您最初是如何获得649305字节的?谁给你的那个号码?是你的代码,还是你真的查看了磁盘上的文件,看看它有多大?在此上下文中,压缩讨论有意义的唯一方法是,如果649305字节是本地运行时文件的已压缩大小(磁盘上的实际大小为1189763字节),并且确实,由于某种原因部署到AWS时未打开压缩,并且您收到完整的未压缩文件(我们甚至不知道你是如何部署它的……它真的和本地的一样吗?在这两种情况下你都在运行一个独立的.jar吗?你是在AWS上部署一个.war吗?你真的在这两种情况下都在相同的容器和容器版本中运行应用程序吗?或者你可能在AWS上本地运行Tomcat和Jetty吗?等等).你确定你的邮递员请求没有被打乱,而且你发送的东西也不是偶然的(或比你想象的更多)
编辑:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sandbox</groupId>
<artifactId>spring-boot-file-upload</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.0.0
com.sandbox
在我的AWS EB实例上,一切看起来都很好,所有的数字加起来都和预期的一样。如果你说你的设置像听起来那么简单,那么不幸的是,我和你一样困惑。我只能假设到目前为止,你已经分享了更多(然而,我怀疑这个问题与Spring Boot有关……那么它更有可能与您的AWS配置/设置有关).经过更多调试后,我发现当我直接发布到EC2实例时,一切都按预期进行。我们的主api url和公共api url通过Amazon的api网关服务发出代理请求。出于某种原因,该服务将数据转换为Base64,而不只是传递原始二进制数据
我找到了将API网关更新为直通二进制数据的文档:
我使用的是multipart/form data
的内容类型值。不要忘了在启用二进制支持的API设置中添加它
我不必编辑标题选项,另外我使用了默认的“方法请求传递”模板。
最后,不要忘记部署您的api更改
它现在正在按预期工作。实现的解决方案片段:
MyApi:
Type: AWS::Serverless::Api
Properties:
BinaryMediaTypes:
- "multipart/form-data"
您是否正在对文件进行gzip压缩?是否可以检查一次。日志筛选器正在更改请求,这会导致不同的文件大小。您是否也可以提供PropertyBLL.addPhotos()
method?@MaruthiAdithya添加。我在测试期间还执行了一个files.copy(from,to)对二进制文件执行健全性测试。(结果在有关十六进制转储的注释中)@KennyCason看起来多部分文件上载在AWS API网关上有问题。AWS开发者页面中有一个线程,它完全讨论了您的问题。请参阅和。找到了许多类似问题的链接,所有这些都集中在将二进制媒体类型改为使用MultiPart/form data
>。首先,我不确定co的哪一部分mments“毫无意义”,我重新阅读了它们,它们对我来说似乎非常清楚。>“file.size将返回上传文件的大小(以字节为单位),而不是请求的大小”。我知道,这就是我所说的。这正是我如此惊讶的原因
MyApi:
Type: AWS::Serverless::Api
Properties:
BinaryMediaTypes:
- "multipart/form-data"