在php中以编程方式将文件从一个服务器复制到另一个服

时间:2014-12-26 11:17:49

标签: php ftp-client

我已将我的所有代码文件托管在一个服务器上,该服务器的域名为example.com,我就是其中一个html页面。我希望example.com的一些文件在另一台域名为example2.com的服务器上移动。我通过互联网搜索,但我找不到任何好的解决方案。请告诉我,如果没有FTP客户端或没有我们手动上传文件的浏览器,这是可能的。或者是否有任何方法可以将HTML表单中的文件从一个服务器提交到另一个服务器,就像我们要写的那样

<form action="http://example2.com/action_page.php">

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

还有两种方法可用于从其他服务器复制文件。

- 一个是从example.com中删除.htaccess文件或允许访问所有文件(通过修改.htaccess文件)。 - 通过各自的URL访问/读取这些文件,并使用&#39; file_get_contents()&#39;保存这些文件。和&#39; file_put_contents()&#39;方法。但是这种方法也会使其他人也可以访问所有文件。

            $fileName       = 'filename.extension';
            $sourceFile     = 'http://example.com/path-to-source-folder/' . $fileName;
            $targetLocation = dirname( __FILE__ ) . 'relative-path-destination-folder/' + $fileName;

            saveFileByUrl($sourceFile, $targetLocation);

            function saveFileByUrl ( $source, $destination ) {
                if (function_exists('curl_version')) {
                    $curl   = curl_init($fileName);
                    $fp     = fopen($destination, 'wb');
                    curl_setopt($ch, CURLOPT_FILE, $fp);
                    curl_setopt($ch, CURLOPT_HEADER, 0);
                    curl_exec($ch);
                    curl_close($ch);
                    fclose($fp);
                } else {
                    file_put_contents($destination, file_get_contents($source));
                }
            }

或者您可以在example.com上创建代理/服务,以在验证密码或用户名/密码组合后(根据您的要求)读取特定文件。

            //In myproxy.php
            extract($_REQUEST);
            if (!empty($passkey) && paskey == 'my-secret-key') {
                if (!empty($file) && file_exists($file)) {
                    if (ob_get_length()) {
                        ob_end_clean();
                    }
                    header("Pragma: public");
                    header( "Expires: 0");
                    header( "Cache-Control: must-revalidate, post-check=0, pre-check=0");
                    header( 'Content-Type: ' . mime_content_type($file) );
                    header( "Content-Description: File Transfer");
                    header( 'Content-Disposition: attachment; filename="' . basename( $file ) . '"' );
                    header( "Content-Transfer-Encoding: binary" );
                    header( 'Accept-Ranges: bytes' );
                    header( "Content-Length: " . filesize( $file ) );
                    readfile( $file );
                    exit;
                } else {
                    // File not found 
                }
            } else {
                //  You are not authorised to access this file.
            }

您可以通过网址&#39; http://example.com/myproxy.php?file=filename.extension&passkey=my-secret-key&#39;来访问该代理/服务。

答案 1 :(得分:1)

如果您将此文件的内容设置为:example2.com/action_page.php:

<?php
$tobecopied = 'http://www.example.com/index.html';
$target = $_SERVER['DOCUMENT_ROOT'] . '/contentsofexample/index.html';

if (copy($tobecopied, $target)) {
    //File copied successfully
}else{
    //File could not be copied
}
?>

并通过命令行或cron 运行它(因为你已经编写了一个与php相关的问题,但是禁止使用浏览器!)它应该将example.com/index.html的内容复制到您的站点目录(domain:example2.com),名为contentsofexample。

N.B。如果你想复制整个网站,你应该把它放在for循环中

答案 2 :(得分:0)

也可以使用zip方法在服务器之间交换文件。 您拥有两个服务器,因此不会出现安全问题。

在承载所需文件或文件夹的服务器上,创建一个php脚本并为其创建cron作业。下面的示例代码:

<?php
/**
 * ZIP All content of current folder

/* ZIP File name and path */
$zip_file = 'myfiles.zip';

/* Exclude Files */
$exclude_files = array();
$exclude_files[] = realpath( $zip_file );
$exclude_files[] = realpath( 'somerandomzip.php' );

/* Path of current folder, need empty or null param for current folder */
$root_path = realpath( '' ); //or $root_path = realpath( 'folder_name' ); if the file(s) are in a particular folder residing in the root

/* Initialize archive object */
$zip = new ZipArchive;
$zip_open = $zip->open( $zip_file, ZipArchive::CREATE );

/* Create recursive files list */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator( $root_path ),
    RecursiveIteratorIterator::LEAVES_ONLY
);

/* For each files, get each path and add it in zip */
if( !empty( $files ) ){

    foreach( $files as $name => $file ) {

        /* get path of the file */
        $file_path = $file->getRealPath();

        /* only if it's a file and not directory, and not excluded. */
        if( !is_dir( $file_path ) && !in_array( $file_path, $exclude_files ) ){

            /* get relative path */
            $file_relative_path = str_replace( $root_path, '', $file_path );

            /* Add file to zip archive */
            $zip_addfile = $zip->addFile( $file_path, $file_relative_path );
        }
    }
}
/* Create ZIP after closing the object. */
$zip_close = $zip->close();
?>

在服务器上创建另一个php脚本和cron作业以接收副本,如下所示:

/**
* Transfer Files Server to Server using PHP Copy
*
*/ /* Source File URL */
$remote_file_url = 'url_of_the_zipped';

/* New file name and path for this file */
$local_file ='myfiles.zip';

/* Copy the file from source url to server */ 
$copy = copy($remote_file_url, $local_file );

/* Add notice for success/failure */ 
if( !$copy ) {
echo "Failed to copy $file...\n"; }
else{
echo "Copied $file successfully...\n"; }
$file = 'myfiles.zip';
$path = pathinfo( realpath( $file ), PATHINFO_DIRNAME );
$zip = new ZipArchive;
$res = $zip->open($file);
if ($res === TRUE) {
$zip->extractTo( $path );
$zip->close();
echo "$file extracted to $path"; }
else {
echo "Couldn't open $file";
}
?>

Voila!

答案 3 :(得分:-1)

    <?php
/* Source File URL */
$remote_file_url = 'http://origin-server-url/files.zip';
  
/* New file name and path for this new file */
$local_file = 'files.zip';
  
/* Copy the file from source url to server */
$copy = copy( $remote_file_url, $local_file );
  
/* Add notice for success/failure */
if( !$copy ) {
    echo "Doh! failed to copy $file...\n";
}
else{
    echo "WOOT! Thanks Munshi and OBOYOB! success to copy $file...\n";
}
?>