使用 Play-S3 上传 S3 文件对图像失败但对文本文件有效
S3 File upload using Play-S3 fails for images but works for text files
我正在尝试使用 Scala Playframe 工作将文件上传到 S3 2.4.1
特别是使用模块 play-s3 7.0.2
我可以让它为文本文件工作,但是当我尝试上传图片时,我收到这条消息,The provided 'x-amz-content-sha256' header does not match what was computed.
如果我在下面的代码中将 "avatar.jpeg" 换成 "text.txt" 并将 "image/jpeg" 换成 "plain/text",它就可以工作。文本文件被上传到 S3。但是,如果我尝试上传图像(我尝试过 jpeg 和 png),它会失败并提示 header 不匹配。我不知道我现在做错了什么,这让我抓狂。
import fly.play.s3.{BucketFile, S3, S3Exception}
import java.nio.file.{Files, Paths}
def test() = Action
{ implicit request =>
val file_path = "/path/to/file/avatar.jpeg"
val bucket = S3("path_to_bucket")
val byte_array = Files.readAllBytes(Paths.get(file_path))
val result = bucket + BucketFile("avatar.jpeg", "image/jpeg", byte_array)
result.map { unit =>
Logger.info("Saved the file")
}
.recover {
case S3Exception(status, code, message, originalXml) =>
{
Logger.info("Error: " + message)
Logger.info("originalXml: " + originalXml)
}
}
Ok("Yay")
}
解决方法是不使用play 2.4.1。 2.4.1 的二进制数据散列有问题。不过 2.4.2 工作得很好。
我正在尝试使用 Scala Playframe 工作将文件上传到 S3 2.4.1
特别是使用模块 play-s3 7.0.2
我可以让它为文本文件工作,但是当我尝试上传图片时,我收到这条消息,The provided 'x-amz-content-sha256' header does not match what was computed.
如果我在下面的代码中将 "avatar.jpeg" 换成 "text.txt" 并将 "image/jpeg" 换成 "plain/text",它就可以工作。文本文件被上传到 S3。但是,如果我尝试上传图像(我尝试过 jpeg 和 png),它会失败并提示 header 不匹配。我不知道我现在做错了什么,这让我抓狂。
import fly.play.s3.{BucketFile, S3, S3Exception}
import java.nio.file.{Files, Paths}
def test() = Action
{ implicit request =>
val file_path = "/path/to/file/avatar.jpeg"
val bucket = S3("path_to_bucket")
val byte_array = Files.readAllBytes(Paths.get(file_path))
val result = bucket + BucketFile("avatar.jpeg", "image/jpeg", byte_array)
result.map { unit =>
Logger.info("Saved the file")
}
.recover {
case S3Exception(status, code, message, originalXml) =>
{
Logger.info("Error: " + message)
Logger.info("originalXml: " + originalXml)
}
}
Ok("Yay")
}
解决方法是不使用play 2.4.1。 2.4.1 的二进制数据散列有问题。不过 2.4.2 工作得很好。