文件上传中断

时间:2012-02-16 21:47:19

标签: php file-upload server-side

我想将大文件上传到我的服务器,但我希望能够在上传过程中中断(例如,用户必须能够关闭计算机并在重新启动后继续)。

我想我可以处理客户端上传,但我不知道如何制作服务器端。在服务器端制作它的最佳方法是什么? PHP能够做到吗? PHP是最有效的吗?

非常感谢

2 个答案:

答案 0 :(得分:0)

如果您设法做客户端,请将文件分块发布,您可以在服务器端执行类似的操作:

    // set the path of the file you upload
    $path = $_GET['path']; 
    // set the `append` parameter to 1 if you want to append to an existing file, if you are uploading a new chunk of data
    $append = intval($_GET['append']); 

    // convert the path you sent via post to a physical filename on the server
    $filename = $this->convertToPhysicalPath($path);

    // get the temporary file
    $tmp_file = $_FILES['file']['tmp_name'];

    // if this is not appending
    if ($append == 0) {
        // just copy the uploaded file
        copy($tmp_file, $filename);
    } else { 
        // append file contents
        $write_handle = fopen($filename, "ab");
        $read_handle = fopen($tmp_file, "rb");

        $contents = fread($read_handle, filesize($tmp_file));
        fwrite($write_handle, $contents);

        fclose($write_handle);
        fclose($read_handle);
    }

答案 1 :(得分:0)

如果您正在尝试设计一个网络界面,允许任何人上传大文件并继续上传,但我不知道如何帮助您。但是,如果您想要做的就是以可恢复的方式将文件从您的计算机传送到服务器,您可以使用rsync之类的工具。 Rsync比较源和目标上的文件,然后仅复制两者之间的差异。这样,如果您有50 GB的文件上传到服务器然后更改一个,rsync将非常快速地检查所有其他文件是否相同,然后只发送一个更改的文件。这也意味着如果传输中断,则通过rsync的一部分将从中断处继续。

传统上,rsync是从命令行(终端)运行的,默认安装在大多数Linux和Mac OS X上。

rsync -avz /home/user/data sever:src/data 

这会将/ home / user / data中的所有文件传输到服务器上的src / data。如果您随后更改/ home / user / data中的任何文件,则可以再次运行该命令以重新同步它。

如果您使用Windows,最简单的解决方案可能是使用DeltaCopy,这是一个围绕rsync的GUI。download