从客户端通过服务器到客户端的PHP文件流

时间:2012-10-16 14:27:41

标签: php file-upload streaming download

问题

是否可以通过PHP流式传输上传文件,以便其他客户端可以在第一个上传文件时下载?

我不想永久保存服务器上的文件。我怎么能这样做?

为何选择PHP?

下载客户端不需要额外的软件来获取流。我认为最简单的方法就是webbrowser。

3 个答案:

答案 0 :(得分:3)

这是可能的,但实施将会相当尴尬。主要障碍是多部分POST请求的处理被硬编码到PHP中。在调用脚本之前,它总是将文件保存到临时位置。一种解决方法是将PHP-CLI设置为CGI脚本。由于PHP的CLI版本不支持HTTP,因此可以让您掌握传入的数据。

.CGI文件看起来像这样:

#!/usr/local/src/php-4.3.4/sapi/cli/php
<?php

// populate $_GET
parse_str($_ENV['QUERY_STRING'], $_GET);

// get the session id from the cookie
parse_str($_ENV['HTTP_COOKIE'], $_COOKIE);
$session_name = ini_get("session.name");
$session_id = $_COOKIE[$session_name];

// get the length of the request body
$length = (int) $_ENV['CONTENT_LENGTH'];

// read the POST data
$stdin = fopen("php://stdin", "rb");

while($chunk = fread($stdin, 4096)) {
    [...]
}

?>

解析RFC1867请求并非易事。我想,协调上传方和下载方也会相当棘手。

答案 1 :(得分:2)

看来你不能直接。在文件上传完成之前,您的PHP脚本将不会执行。使用APC,似乎您可以获取正在上载的文件的进度,但不能获得实际的字节本身。唯一的另一种方法是使用套接字在PHP中编写自己的服务器,而不是。

作为替代方案,如果你有Node.js(或其他任何东西,真的),你可以做这样的事情:

  1. 客户端A连接并开始上传
  2. 服务器开始将上传内容写入磁盘
  3. 客户端B连接,请求下载客户端A的数据
  4. 服务器从磁盘读取缓冲数据并发送到客户端A
  5. 服务器在数据可用时继续发送,直到客户端A或B断开连接
  6. 磁盘缓冲区选项是最简单的选项,但是对于大型文件或实时流,如果客户端B能够跟上,或者如果客户端B能够跟上,那么您可能希望在数据进入时没有磁盘的情况下直接转发到发送。数据丢失不是问题。

答案 2 :(得分:0)

您应该研究tus协议-有一个支持它的php库(https://github.com/ankitpokhrel/tus-php)以及Javascript框架,包括用于客户端的uppy(uppy.io)。