alibaba-rsocket-broker icon indicating copy to clipboard operation
alibaba-rsocket-broker copied to clipboard

如何使用 rsocket 上传文件

Open sdack-cloud opened this issue 1 year ago • 2 comments

  • 这个问题我知道和这个项目没有关系,但是在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);
      }

这张图片只有一部分 uploaded_file

使用 Spring boot 的 PostMapping 可以上传大视频文件。(超过1G,并传回,postman测试)


    @PostMapping("/upload")
    fun upload(@RequestPart file: FilePart): Flux<DataBuffer> {
        println(file.filename())
        return file.content()
    }


sdack-cloud avatar Jun 01 '24 07:06 sdack-cloud

@linux-china

sdack-cloud avatar Jun 04 '24 01:06 sdack-cloud

个人是不建议使用RSocket来传输大文件,这样效率非常不高。 现在OSS操作基本上都是在源头操作,就是在接收到文件上传后,马上保存到OSS上,直接进行liushi对接,效率非常高。

你使用RSocket也可以,要转换为bytes数组,序列化和反序列化,中间这些浪费是完全没有必要,个人不建议这样操作。

linux-china avatar Jun 04 '24 01:06 linux-china