gpt4 book ai didi

http - 如何在 Java 中安全地处理原始(文件)数据?

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:10:06 25 4
gpt4 key购买 nike

图像在被检索(通过 HTTP)然后被发送(通过 HTTP)到数据库时被损坏。图像的原始数据以字符串形式处理。

该服务发送图像文件的 GET,接收带有原始图像数据(响应正文)和内容类型的响应。然后,发送带有上述请求正文和 Content-Type header 的 PUT 请求。 (PUT 请求是通过在字符串中提供正文来构造的)此 PUT 请求被发送到 RESTful 数据库 (CouchDB),创建一个 attachment (对于那些不熟悉 CouchDB 的人来说,附件就像一个静态文件)。

现在我有了原始图像,我的服务将其 GET 和 PUT 到数据库,以及原始图像的这个“副本”,我现在可以从数据库中获取它。如果我然后 `curl --head -v "[copy's url]"它具有原始图像的 Content-Type,但 Content-Length 已更改,从 200kb 变为大约 400kb。如果我使用浏览器获取“复制”图像,则不会渲染它,而原始渲染效果很好。它已损坏。

可能是什么原因?我的猜测是,在将原始数据作为字符串处理时,我的框架猜测编码错误并破坏了它。我无法证实或否认这一点。我怎样才能以安全的方式处理这个原始数据/请求主体,或者我怎样才能正确处理编码(如果证明这是问题所在)?

详情:Play2 Framework's HTTP client ,斯卡拉。下面是重现测试:

"able to copy an image" in {
def waitFor[T](future:Future[T]):T = { // to bypass futures
Await.result(future, Duration(10000, "millis"))
}
val originalImageUrl = "http://laughingsquid.com/wp-content/uploads/grumpy-cat.jpg"
val couchdbUrl = "http://admin:admin@localhost:5984/testdb"
val getOriginal:ws.Response = waitFor(WS.url(originalImageUrl).get)
getOriginal.status mustEqual 200
val rawImage:String = getOriginal.body
val originalContentType = getOriginal.header("Content-Type").get

// need an empty doc to have something to attach the attachment to
val emptyDocUrl = couchdbUrl + "/empty_doc"
val putEmptyDoc:ws.Response = waitFor(WS.url(emptyDocUrl).put("{}"))
putEmptyDoc.status mustEqual 201
//uploading an attachment will require the doc's revision
val emptyDocRev = (putEmptyDoc.json \ "rev").as[String]

// create actual attachment/static file
val attachmentUrl = emptyDocUrl + "/0"
val putAttachment:ws.Response = waitFor(WS.url(attachmentUrl)
.withHeaders(("If-Match", emptyDocRev), ("Content-Type", originalContentType))
.put(rawImage))
putAttachment.status mustEqual 201

// retrieve attachment
val getAttachment:ws.Response = waitFor(WS.url(attachmentUrl).get)
getAttachment.status mustEqual 200
val attachmentContentType = getAttachment.header("Content-Type").get

originalContentType mustEqual attachmentContentType
val originalAndCopyMatch = getOriginal.body == getAttachment.body
originalAndCopyMatch aka "original matches copy" must beTrue // << false
}

在最后一个“必须”失败:

[error] x  able to copy an image
[error] original matches copy is false (ApplicationSpec.scala:112)

最佳答案

转换为 String 肯定会导致问题。您需要像 Daniel 提到的那样处理字节。

查看源代码,它看起来像 ws.Response 只是一个包装器。如果你到达底层类,那么有一些方法可以帮助你。在 Java 方面,有人在 GitHub 上做出 promise ,公开了除 String 之外的更多获取响应数据的方法。

我不熟悉 scala,但这样的东西可能有用:

getOriginal.getAHCResponse.getResponseBodyAsBytes

// instead of getOriginal.body

WS.scala
https://github.com/playframework/playframework/blob/master/framework/src/play/src/main/scala/play/api/libs/ws/WS.scala

WS.java
在这里您可以看到 Response 有一些新方法,getBodyAsStream()asByteArray
https://github.com/playframework/playframework/blob/master/framework/src/play-java/src/main/java/play/libs/WS.java

关于http - 如何在 Java 中安全地处理原始(文件)数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18360086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com