编辑:解决了我自己。负载平衡器问题。
我第一次使用Sping Boot 和Webflux实现图像上传。我的应用程序部署到Google Cloud Platform,并位于Cloudflare后面。我怀疑CF一般是一个问题,因为所有其他类型的HTTP请求都可以正常工作。我想知道multipart/form-data是否是正确的方法。因为Postman给了我这样一个curl
请求:
curl --location 'protocol://some-location/properties/967275918/images' \
--form 'image=@"C:/Users/MyUser/Pictures/testimage.jpg"'
在我的本地机器上,它在Controller中使用此代码工作正常,但是当部署到GCP时,我遇到超时。
发布表单是正确的方法吗?或者我的假设是正确的,我需要首先将ByteArray
从客户端传递到服务器?
避免混淆代码:这个Sping Boot 应用程序是一个后端编排服务。它应该接收Image并将其转发到“真实的的”后端。
@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。可能是我的代码在云中没有意义,但在我的本地机器上运行良好。
1条答案
按热度按时间nnvyjq4y1#
原来这不是一个编码问题,而是一个负载均衡器的配置问题。我忘了添加新的路由到反向代理。GCP Loadbalancer只是在找不到路由的后端时超时。