【问题标题】:Process Uploaded file on web server without storing locally first?在网络服务器上处理上传的文件而不先在本地存储?
【发布时间】:2017-03-21 10:09:12
【问题描述】:

我正在尝试在网络服务器上实时处理用户上传的文件, 但似乎,APACHE 调用 PHP,只有一次完整的文件上传。

当我使用 CURL 上传文件并设置

传输编码:“分块”

我取得了一些成功,但不能通过浏览器做同样的事情。

  • 我使用了 Dropzone.js,但是当我尝试设置相同的标头时,它说 Transfer -Encoding 是一个不安全的标头,因此没有设置它。

这个答案解释了那里的问题。 Can't set Transfer-Encoding :"Chunked from Browser"

简而言之,问题是,当用户将文件上传到网络服务器时,我希望网络服务器在第一个字节可用时立即开始处理它。 通过过程我的意思是,将其通过管道传输到命名管道。

不希望 500mb 先上传到服务器,然后再开始处理。

但是使用当前的 Web 服务器 (APACHE - PHP),我似乎无法完成它。

有人可以解释一下,使用什么技术堆栈或解决方法,以便我可以通过浏览器上传大文件并开始处理它,只要第一个字节可用。

【问题讨论】:

  • 如果你有兴趣可以通过node js来做我可以发布答案
  • 您能否使用 Fineuploader 将 5 MB 的块上传到 Amazon AWS 并启动一个 cron 来检查新的 AWS 文件并为命名管道处理它?
  • @bxN5 :是的,请发帖,目前我正在尝试对 busboy 库做同样的事情,在“数据”功能上,我正在将块传递给子进程..!
  • @ChetanPatel :我不打算流式传输到 AWS,我想流式传输到外部应用程序,例如 tshark。

标签: php node.js apache file-upload dropzone.js


【解决方案1】:

可以使用 NodeJS/Multiparty 来做到这一点。 Here 他们有一个直接上传到 Amazon S3 的示例。 This 是表单,它将内容类型设置为multipart/form-data。而here是表单零件加工的功能。 part 参数的类型为 ReadableStream,这将允许使用 data 事件对输入进行逐块处理。

更多关于节点 js 中可读流的信息是here

【讨论】:

    【解决方案2】:

    如果您真的想要(抱歉,认为这不是一个好主意),您应该尝试寻找可以完成您工作的 FUSE 文件系统。

    也许已经有一个https://github.com/libfuse/libfuse/wiki/Filesystems

    或者你应该自己写。

    但请记住,一旦上传完成并且发布脚本完成他的工作,临时文件将被删除

    【讨论】:

    • 恐怕,这不是我要找的。我只想将上传的文件流式传输到外部应用程序,而不是先存储它。
    【解决方案3】:

    您可以使用 html5 可恢复上传工具(如 Resumable.js)上传文件,并在收到上传的部分后立即处理。

    或者作为一种解决方法,您可以找到上传文件的路径(通常在 /tmp 中),然后编写一个后台作业将其流式传输到第三个应用程序。可能会更难。

    可能还有其他解决方案...

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2016-11-17
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多