Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@midwayjs/upload 当 mode 为 stream 时 ,文件内容读取的问题 #3071

Open
wtdsn opened this issue Jul 9, 2023 · 0 comments
Open

Comments

@wtdsn
Copy link

wtdsn commented Jul 9, 2023

  • Node Version: 18.14.0
  • Midway Version(Decorator/Core): "@midwayjs/cli": "^2.1.1",
  • Platform: window

简单贴点代码

错误情况

当文件的内容有连续的两个换行时,就会出现问题。比如文件的内容是 a(换行)(换行)b 。那么结果是:
image
也就是,最后的 data 只有 a 。

个人拙见

const headSeparator = Buffer.from('\r\n\r\n'); headSeparator是分割头部和内容的。但,如果内容中,也有 \r\n\r\n 即连续的两个换行,那么也会被分割。则就导致出现了问题。
当 mode 是 file 时,是没有问题的,这是 mode 为 file 时执行的 const [headerBuf, data] = (0, exports.bufferSplit)(buf, headSeparator, 2); 。最后的参数 2 , 使得 split 只分割为2个,也就是 data 就是 header 之后的部分。因此不会有问题。
如果 stream 的部分代码也在分割 header 和 data 时加上参数2 ,确实能解决问题。不加上此参数是什么原因呢?

其他疑问 ( 有没有大佬解释一下咧 )

  • 为什么 mode 为 stream 时,只读取一个文件,为了防止内存的占用过多吗?
  • 当 mode 为 stream 时,当读取了文件后,就会 break 。也就是之后的其他 Field 就不会读取。但是如果在读取文件前,先读取了其他 field ,那么就能读取。这样子设计是考虑了什么?

async upload(@Files() files, @Fields() fileds){} 也就是,如果 fomdata 里即有文件,也有其他,比如 name=jack 。那么如果 name 先添加到 formdata ,那么 fileds 中就会有 name ,如果是文件先添加到 formdata ,那么 fileds 为空对象。

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

No branches or pull requests

1 participant