alibaba-rsocket-broker
alibaba-rsocket-broker copied to clipboard
如何使用 rsocket 上传文件
-
这个问题我知道和这个项目没有关系,但是在spring-framework 提的问题被关闭,让在stackoverflow提问,但是stackoverflow 关于rsocket问题热点很低。所以来此求助(chatgpt 我也问了)
-
第二个问题是关于alibaba-rsocket-broker 的。就是接收到的文件数据怎么传递给 broker 的 service 端进行保存
接收 130KB 时,这是可能的,但如果大于 130Kb 则会出错
Kotlin
@MessageMapping("/upload")
fun upload(@Payload fileData: ByteArray?): Mono<String> {
println("========= OK")
println("========= OK "+ fileData!!.size)
val uploadFile = File("/Users/Downloads/uploaded_file.png")
return Mono.just("ok").doOnSuccess {
try {
FileOutputStream(uploadFile).use { fos ->
fos.write(fileData!!)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
}
我使用 srocket-js 上传文件
upload(file) {
let route = encodeRoute("/upload");
let compositeMetaData = encodeCompositeMetadata([
[WellKnownMimeType.MESSAGE_RSOCKET_ROUTING, route]
]);
const reader = new FileReader();
reader.onload = (event) => {
let result = event.target.result as ArrayBuffer;
console.log(result)
this.socket.requestResponse({data: Buffer.from(result), metadata: compositeMetaData}, {
onComplete(): void {
}, onError(error: Error): void {
console.error("Error", error);
}, onExtension(extendedType: number, content: Buffer | null | undefined, canBeIgnored: boolean): void {
}, onNext(payload: Payload, isComplete: boolean): void {
console.log("OK", isComplete);
console.log("payload", payload.data);
}
})
}
reader.readAsArrayBuffer(file);
}
这张图片只有一部分
使用 Spring boot 的 PostMapping 可以上传大视频文件。(超过1G,并传回,postman测试)
@PostMapping("/upload")
fun upload(@RequestPart file: FilePart): Flux<DataBuffer> {
println(file.filename())
return file.content()
}
@linux-china
个人是不建议使用RSocket来传输大文件,这样效率非常不高。 现在OSS操作基本上都是在源头操作,就是在接收到文件上传后,马上保存到OSS上,直接进行liushi对接,效率非常高。
你使用RSocket也可以,要转换为bytes数组,序列化和反序列化,中间这些浪费是完全没有必要,个人不建议这样操作。