如何使用PHP FTP模块将文件分块上传?

5

我擅长使用PHP FTP函数上传文件。如果文件不太大,一切顺利。但是当文件大小变得很大时,就会失败。

因此,我需要一个连接到FTP并分块上传文件的代码示例。

这是我的现有代码:

$ftp_server = ftp_server;
$ftp_user_name=ftp_user_name;
$ftp_user_pass=ftp_user_pass;
$file = $_FILES["file"]["tmp_name"];
$remote_file = 'uploads/'.$_GET['file_name'];
$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, true);
if ( ftp_put($conn_id, $remote_file, $file, FTP_BINARY) ) echo "Success"; else echo "Error";
ftp_close($conn_id);

更新

var uploader = new plupload.Uploader({
    runtimes : 'html5,flash,silverlight,html4',
    browse_button : 'pickfiles', // you can pass an id...
    container: document.getElementById('container'), // ... or DOM Element itself
    url : 'upload.php',
    flash_swf_url : '../js/Moxie.swf',
    silverlight_xap_url : '../js/Moxie.xap',

    filters : {
        max_file_size : '1000mb',
        mime_types: [
            {title : "Image files", extensions : "jpg,gif,png"},
            {title : "Video files", extensions : "mp4,wmv"}
        ]
    },

    init: {
        PostInit: function() {
            document.getElementById('filelist').innerHTML = '';

            document.getElementById('uploadfiles').onclick = function() {
                uploader.start();
                return false;
            };
        },

        FilesAdded: function(up, files) {
            plupload.each(files, function(file) {
                document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';
            });
        },

        UploadProgress: function(up, file) {
            document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
        },

        Error: function(up, err) {
            document.getElementById('console').appendChild(document.createTextNode("\nError #" + err.code + ": " + err.message));
        }
    }
});

uploader.init();

Error Error


具体是什么失败了?你为什么认为分块上传会有所帮助? - Martin Prikryl
那么是HTTP请求被重置了吗?很可能是因为PHP代码的最大执行时间超过了。为什么不将它设置得更长一些呢? - Martin Prikryl
我已经更改为72000,但在达到这个数值之前,它被重置了。 - AWE
我会专注于解决“重置”问题,而不是试图通过分块上传来绕过它。对于分块上传,您需要实现本地JavaScript代码来拆分文件并单独“PUT”每个块。这并不容易。解决“重置”问题可能更容易些。 - Martin Prikryl
1个回答

3
要将文件以分块方式上传到FTP服务器,请使用ftp_fput方法。

对于每个块:

  • 调用ftp_fput方法,并将$startpos参数设置为已上传块的总长度。
  • 对于$handle,请使用一个带有该块的内存流。

或者,使用file_put_contents方法,并使用以下内容:


或者,使用fopen(使用a模式)/fwrite/fclose和FTP URL wrapper。


谢谢回复。我在PHP方面不太擅长。你能否给一个示例样本?如果你不介意的话。:) 有一件急事。我已经更新了我的JS代码。 - AWE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接