• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ftp_fput()

    (PHP 4, PHP 5, PHP 7)

    上传一个已经打开的文件到 FTP 服务器

    说明

    ftp_fput(resource $ftp_stream,string $remote_file,resource $handle,int $mode[,int $startpos= 0]): bool

    ftp_fput()函数用来上传一个在已经打开的文件中的数据到 FTP 服务器。

    参数

    $ftp_stream

    FTP 连接的链接标识符。

    $remote_file

    远程文件路径。

    $handle

    打开的本地文件句柄,读取到文件末尾。

    $mode

    传输模式只能为(文本模式)FTP_ASCII或(二进制模式)FTP_BINARY其中的一个。

    $startpos

    远程文件上传的开始位置。

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    ftp_fput()例子

    <?php
    // open some file for reading
    $file = 'somefile.txt';
    $fp = fopen($file, 'r');
    // set up basic connection
    $conn_id = ftp_connect($ftp_server);
    // login with username and password
    $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
    // try to upload $file
    if (ftp_fput($conn_id, $file, $fp, FTP_ASCII)) {
        echo "Successfully uploaded $file\n";
    } else {
        echo "There was a problem while uploading $file\n";
    }
    // close the connection and the file handler
    ftp_close($conn_id);
    fclose($fp);
    ?>
    

    更新日志

    版本说明
    4.3.0添加了$startpos的支持。

    参见

    For directly inserting content into a file on an FTP host, you could also create a string stream wich streams directly to the ftp_fput function. 
    This should create less overhead than first writing to any temp directories locally before streaming, as suggested here.
    <?php
    $string = "Your content goes here";
    $stream = fopen('data://text/plain,' . $string,'r');
    ftp_fput($this->connection,$pathTo,$stream, FTP_BINARY);
    ?>
    
    If when using fput you get the one of the following errors:
    Warning: ftp_fput() [function.ftp-fput]: Opening ASCII mode data connection
    Warning: ftp_fput() [function.ftp-fput]: Opening BINARY mode data connection
    and it creates the file in the correct location but is a 0kb file and all FTP commands thereafter fail. It is likely that the client is behind a firewall. To rectify this use:
    <?php
    ftp_pasv($resource, true);
    ?>
    Before executing any put commands. Took me so long to figure this out I actually cheered when I did :D
    Make sure you chdir to remote directory before using ftp_put or else ftp_put will just return error that it cannot create file. After you do the chdir you should NOT pass the whole path of file to ftp_put but just basename (filename). See example for more info.
    Example:
    <?php
    $locpath = 'local_path/resources/js/test.js';
    $rempath = 'resources/js/';
    $remFile = 'test.js';
    ftp_chdir($this->conn_id, $rempath);
    ftp_put($this->conn_id, $remFile, $locpath, FTP_BINARY);
    ?>
    
    When you have your file contents as a string, create temporary stream and use that as a file handle.
    <?php
    $contents = "This is a test file\nTesting 1,2,3..";
    $tempHandle = fopen('php://temp', 'r+');
    fwrite($tempHandle, $contents);
    rewind($tempHandle);    
    ftp_fput($this->ftp, $filename, $tempHandle, FTP_ASCII);
    ?>
    
    This might be obvious to most of you, but make sure your stream isn't write-only. It has to be able to read from your stream in order to upload its contents.
    Took me a while trying to figure out why my uploaded file was 0B, and that was why.
    Fails if destination file exists. Delete first and it works.
    You might also want to note that ftp_fput will overwrite any existing file.
    Using jopi paranoid fi's example, tmpfile() works on PHP 4 and 5 instead of using the php://temp file.
    This is a function i wrote to copy a complete directory to a FTP-Server-folder.
    function ftp_uploaddirectory($conn_id, $local_dir, $remote_dir)
    {
     @ftp_mkdir($conn_id, $remote_dir);
     $handle = opendir($local_dir);
     while (($file = readdir($handle)) !== false)
     {
      if (($file != '.') && ($file != '..'))
      {
       if (is_dir($local_dir.$file))
       {
        ftp_uploaddirectory($conn_id, $local_dir.$file.'/', $remote_dir.$file.'/');
       }
       else
        $f[] = $file;
      }
     }
     closedir($handle);
     if (count($f))
     {
      sort($f);
      @ftp_chdir($conn_id, $remote_dir);
      foreach ($f as $files)
      {
       $from = @fopen("$local_dir$files", 'r');
       @ftp_fput($conn_id, $files, $from, FTP_BINARY);
      }
     }
    }
    Example:
    $conn_id = @ftp_connect($server);
    @ftp_login ($conn_id, $username, $passwort);
    ftp_uploaddirectory($conn_id, 'mydirectory/', 'theftpdirectory/');
    @ftp_quit($conn_id);
    I hope you'll find it useful.
    If you want to pass a string containing the filename as source and not a resource handle use ftp_put() instead. Trivial but not mentioned here.

    上篇:ftp_fget()

    下篇:ftp_get_option()