Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

如何使用 rsocket 上传文件 #249

Open
sdack-cloud opened this issue Jun 1, 2024 · 2 comments
Open

如何使用 rsocket 上传文件 #249

sdack-cloud opened this issue Jun 1, 2024 · 2 comments

Comments

@sdack-cloud
Copy link

sdack-cloud commented Jun 1, 2024

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

@linux-china

@linux-china
Copy link
Collaborator

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

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

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants