编辑:自己解决的。loadbalance问题。
我第一次使用Webflux的Spring Boot实现图像上传。我的应用程序部署在谷歌云平台上,位于Cloudflare后面。我怀疑CF通常是一个问题,因为所有其他类型的HTTP请求都工作得很好。我想知道多部分/形式数据是正确的方法,然后放在第一位。因为邮差给了我这样一个curl
请求:
curl --location 'protocol://some-location/properties/967275918/images'
--form 'image=@"C:/Users/MyUser/Pictures/testimage.jpg"'
在我的本地机器上,控制器中的这段代码工作得很好,但是当部署到GCP中时,我遇到了超时。
是张贴表单的正确方法,还是我的假设是正确的,我需要首先从客户端传递ByteArray
到服务器?
为了避免代码混乱:这个Spring Boot应用程序是一个后端编排服务。它应该接收图像并将其转发到一个"真实的";后端。
@RequestMapping(
method = RequestMethod.POST,
value = "/properties/{property-id}/images",
consumes = { "multipart/form-data" }
)
fun uploadPropertyImage(propertyId: String, image: Flux<Part>, exchange: ServerWebExchange) : Mono<ResponseEntity<Void>> {
return image.next()
.map { it.headers().contentType!! }
.flatMap { mediaType ->
val imagePartContents = image.flatMap(Part::content)
DataBufferUtils
.join(imagePartContents)
.flatMap { dataBuffer ->
val imageAsByteArray = dataBuffer.imageAsByteArray()
propertyApiAdapter.uploadImage(propertyId, imageAsByteArray, mediaType)
.map { ResponseEntity.ok().build() }
}
}
}
注:这也是我第一次编写Spring Webflux代码。可能是我的代码在云中没有意义,但是它在我的本地机器上工作得很好。
原来这不是编码问题,而是负载均衡器配置问题。我忘记给反向代理添加新路由了。GCP Loadbalancer只是在找不到路由后端时超时。