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

Http 如何在Java中安全地处理原始(文件)数据?,http,scala,request,playframework-2.0,Http,Scala,Request,Playframework 2.0,图像在检索(通过HTTP)然后发送(通过HTTP)到数据库时损坏。图像的原始数据以字符串形式处理 该服务发送图像文件的GET,接收原始图像数据(响应的主体)和内容类型的响应。然后,使用上述请求的主体和内容类型头发送PUT请求。(PUT请求是通过提供字符串形式的主体来构造的)这个PUT请求被发送到一个RESTful数据库(CouchDB),创建一个(对于那些不熟悉CouchDB的人来说,附件就像一个静态文件) 现在我有了原始图像,我的服务将其获取并放入数据库,还有原始图像的“副本”,我现在可以从数

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

该服务发送图像文件的GET,接收原始图像数据(响应的主体)和内容类型的响应。然后,使用上述请求的主体和内容类型头发送PUT请求。(PUT请求是通过提供字符串形式的主体来构造的)这个PUT请求被发送到一个RESTful数据库(CouchDB),创建一个(对于那些不熟悉CouchDB的人来说,附件就像一个静态文件)

现在我有了原始图像,我的服务将其获取并放入数据库,还有原始图像的“副本”,我现在可以从数据库中获取。如果我使用`curl--head-v“[copy's url]”,它的内容类型与原始图像相同,但内容长度发生了变化,从200kb变为400kb左右。如果我使用浏览器获取“复制”图像,它不会被渲染,而原始图像渲染良好。它被破坏了

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

详情:,Scala。下面是复制的测试:

中的“能够复制图像”{
def waitFor[T](future:future[T]):T={//以绕过期货
等待结果(未来,持续时间(10000,“毫秒”))
}
val originalImageUrl=”http://laughingsquid.com/wp-content/uploads/grumpy-cat.jpg"
val couchdbUrl=”http://admin:admin@本地主机:5984/testdb“
val getOriginal:ws.Response=waitFor(ws.url(originalImageUrl.get)
getOriginal.status必须等于200
val rawImage:String=getOriginal.body
val originalContentType=getOriginal.header(“内容类型”).get
//需要一个空的文档来附加附件
val emptyDocUrl=couchdbUrl+“/empty_doc”
val putEmptyDoc:ws.Response=waitFor(ws.url(emptyDocUrl.put(“{}”))
putEmptyDoc.status必须等于201
//上传附件需要对文档进行修订
val emptyDocRev=(putEmptyDoc.json \“rev”).as[String]
//创建实际附件/静态文件
val attachmentUrl=emptyDocUrl+“/0”
val putAttachment:ws.Response=waitFor(ws.url(attachmentUrl)
.WithHeader((“如果匹配”,则为emptyDocRev),(“内容类型”,则为originalContentType))
.put(图像))
putAttachment.status必须等于201
//检索附件
val getAttachment:ws.Response=waitFor(ws.url(attachmentUrl.get)
getAttachment.status必须等于200
val attachmentContentType=getAttachment.header(“内容类型”).get
originalContentType必须等于attachmentContentType
val originalAndCopyMatch=getOriginal.body==getAttachment.body

originalAndCopyMatch又名“original matches copy”必须正确//到
字符串的转换肯定会导致问题。您需要使用Daniel提到的字节

从源代码看,它看起来像是
ws.Response
只是一个包装器。如果您访问底层类,那么有一些方法可能会对您有所帮助。在Java方面,有人在GitHub上进行了提交,以公开除
字符串
之外的更多获取响应数据的方法

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

getOriginal.getAHCResponse.getResponseBodyAsBytes

// instead of getOriginal.body

WS.scala

WS.java
在这里您可以看到
Response
有一些新方法,
getBodyAsStream()
asByteArray


字符串的转换肯定会引起问题。您需要使用Daniel提到的字节

从源代码看,它看起来像是
ws.Response
只是一个包装器。如果您访问底层类,那么有一些方法可能会对您有所帮助。在Java方面,有人在GitHub上进行了提交,以公开除
字符串
之外的更多获取响应数据的方法

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

getOriginal.getAHCResponse.getResponseBodyAsBytes

// instead of getOriginal.body

WS.scala

WS.java
在这里您可以看到
Response
有一些新方法,
getBodyAsStream()
asByteArray


此数据的检索和处理格式为
Array[Byte]
。其他类型的序列(of
Byte
)也可以,但效率不高。我不回答,因为我不知道您使用的HTTP客户端。此数据的检索和处理格式为
Array[Byte]
。其他类型的序列(字节的)也可以工作,但效率不高。我不会回答,因为我不知道您使用的HTTP客户端。我问题的答案是以字节数组的形式独占处理原始数据。同样奇怪的是,
asByteArray
方法还没有进入scala版本。我问题的答案是以数组的形式处理原始数据同样奇怪的是,
asByteArray
方法还没有进入scala版本。