【发布时间】:2019-11-10 01:51:11
【问题描述】:
我有一个端点,可以将图像文件上传到服务器,然后上传到 S3。
我在localhost上运行,MultipartFile字节大小正确,上传成功。
但是,当我将它部署到我的 EC2 实例时,上传的文件大小不正确。
控制器代码
@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 字节,但是当上传到我的产品服务器时,它读取为 1189763 字节。
- 我的生产服务器是一个 AWS EC2 实例,位于 Https 后面。
- Spring 应用程序 yml 文件是相同的。我覆盖的唯一配置是文件最大大小属性。
- 我正在使用 PostMan 发布请求。我将正文作为表单数据传递,键名为“文件”。
- 同样,它在本地运行时完美运行。
我进行了另一项测试,将上传的文件写入服务器,以便进行比较。
在十六进制编辑器中上传文件的前 n 个字节:
EFBFBD50 4E470D0A 1A0A0000 000D4948 44520000 03000000 02400802 000000EF BFBDCC96 01000000 0467414D 410000EF BFBDEFBF BD0BEFBF BD610500 00002063 48524D00 007A2600
原始文件的前 n 个字节:
89504E47 0D0A1A0A 0000000D 49484452 00000300 00000240 08020000 00B5CC96 01000000 0467414D 410000B1 8F0BFC61 05000000 20634852 4D00007A 26000080 840000FA 00000080
它们似乎都包含文本“PNG”,并且还具有结尾的 EXtdate:modify/create 标记。
Per Request,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 只是一个自定义构建的名称。还有其他代码涉及休眠模型,但不相关。
更新
这似乎与 Https/api 代理有关。当我点击 EC2 节点的 http url 时,它工作正常。但是,当我通过代理 EC2 节点的 api 代理 (https://api.thedomain.com) 时,它会失败。我会沿着这条路继续走下去。
【问题讨论】:
-
您是否对文件进行 gzip 压缩?
-
你能检查一次this。日志过滤器正在更改请求,从而导致文件大小不同。
-
能否也提供
PropertyBLL.addPhotos()方法? -
@MaruthiAdithya 添加。我还在测试期间执行了 Files.copy(from, to) 以对二进制文件执行完整性测试。 (结果是关于十六进制转储的 cmets)
标签: amazon-web-services spring-boot file-upload aws-api-gateway