将文件从一个服务器上传到另一个服务器的PHP方法

13

我正在开发一个网站,服务器存储在另一个服务器中,我需要处理一些事情。我从未遇到过这种情况,但我发现解决方案是使用cURL。

请详细说明如何从零开始使用cURL。

更新:

我使用以下代码测试是否安装并启用了cURL:

<?PHP
phpinfo(); 

$toCheckURL = "http://board/accSystem/webroot/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $toCheckURL);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
$data = curl_exec($ch);
curl_close($ch);
preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/",$data,$matches);
$code = end($matches[1]);
if(!$data) {
  echo "Domain could not be found";
} else {
  switch($code) {
    case '200':
      echo "Page Found";
      break;
    case '401':
      echo "Unauthorized";
      break;
    case '403':
      echo "Forbidden";
      break;
    case '404':
      echo "Page Not Found";
      break;
    case '500':
      echo "Internal Server Error";
      break;
  }
}
?>

这是结果: 在此输入图像描述

我收到了“页面已找到”消息。

现在我可以放心使用cURL,对吗?

注意: 两个服务器都在本地。


更让人头疼的是,我想要检索已上传的文件并查看、更新(用另一个文件替换)以及删除它:") - Learner
我很愿意提供帮助,但我认为我们需要更多的信息。仅仅说想通过curl从另一个服务器检索文件并修改它,这有点含糊不清。 - Andrew
6个回答

29
作为PHP开发者,你可能已经熟悉了PHP最有用的文件系统函数fopen。该函数用于打开文件流并返回一个资源,然后可以将该资源传递给fread或fwrite来读取或写入数据。但有些人并不知道文件资源不必一定指向本地机器上的位置。
下面是一个示例,演示如何将一个文件从本地服务器传输到FTP服务器:
$file = "filename.jpg";
$dest = fopen("ftp://username:password@example.com/" . $file, "wb");
$src = file_get_contents($file);
fwrite($dest, $src, strlen($src));
fclose($dest); 

在PHP手册的附录M中可以找到支持的不同协议列表。根据网络设置和信息的敏感性,您可能希望使用一种采用某些加密机制的协议,例如FTPS或SSH。

curl扩展程序利用客户端URL库(libcurl)传输文件。实现curl解决方案的逻辑通常如下:首先初始化会话,设置所需的传输选项,执行传输,然后关闭会话。

使用curl_init函数初始化curl会话。该函数返回一个资源,您可以像在文件系统函数中使用fopen获取资源一样使用其他curl函数。

使用curl_setopt设置上传目标和传输会话的其他方面,该函数接受curl资源、表示设置的预定义常量和选项值。

以下是一个示例,它使用HTTP协议的PUT方法将文件从本地主机传输到远程服务器:

$file = "testfile.txt";

$c = curl_init();
curl_setopt($c, CURLOPT_URL, "http://example.com/putscript");
curl_setopt($c, CURLOPT_USERPWD, "username:password");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_PUT, true);
curl_setopt($c, CURLOPT_INFILESIZE, filesize($file));

$fp = fopen($file, "r");
curl_setopt($c, CURLOPT_INFILE, $fp);

curl_exec($c);

curl_close($c);
fclose($fp); 

在php文档中可以找到一份curl的有效选项列表。

ftp扩展允许您实现对ftp服务器的客户端访问。当有诸如前两个选项时,使用ftp传输文件可能会过度运作...理想情况下,此扩展应该在需要更高级功能时使用最佳。

使用ftp_connect连接到ftp服务器。使用ftp_login通过提供用户名和密码来验证与ftp服务器的会话。使用ftp_put函数将文件放置在远程服务器上。它接受目标文件名、本地源文件名和预定义常量以指定传输模式:FTP_ASCII表示纯文本传输,FTP_BINARY表示二进制传输。传输完成后,使用ftp_close释放资源并终止ftp会话。

$ftp = ftp_connect("ftp.example.com");
ftp_login($ftp, "username", "password");
ftp_put($ftp, "destfile.zip", "srcfile.zip", FTP_BINARY); 
ftp_close($ftp); 

第一個選項技術上也是FTP,實際的FTP擴展是什麼意思?它有什麼地方過度了嗎? - Vector

6
我们使用与您相同的用例。我们有两个服务器:应用程序服务器和存储服务器。应用程序服务器包含方法和 UI 部分,而存储服务器是我们上传文件的地方。以下是我们正在使用的文件上传方法,它可以正常工作:
1) 您需要在存储服务器上添加一个包含以下方法的 PHP 文件:
<?php
switch ($_POST['calling_method']) {    
case 'upload_file':
    echo uploadFile();
    break;
case 'delete':
    return deleteFile();
    break;    
}

function uploadFile() {
   $localFile = $_FILES['file']['tmp_name'];

   if (!file_exists($_POST['destination'])) {
     mkdir($_POST['destination'], 0777, true);
   }

   $destination = $_POST['destination'] . '/' . $_FILES['file']['name'];
   if (isset($_POST['file_name'])) {
      $destination = $_POST['destination'] . '/' . $_POST['file_name'];
   }
   $moved = move_uploaded_file($localFile, $destination);

   if (isset($_POST['file_name'])) {
    chmod($destination, 0777);
   }
   $result['message'] = $moved ? 'success' : 'fail';
   echo json_encode($result);
 }

function deleteFile() {
   if (file_exists($_POST['file_to_be_deleted'])) {
     $res = unlink($_POST['file_to_be_deleted']);
     return $res;
   }
  return FALSE;
}
?>

2) 在您的应用服务器上。

创建一个方法,将 $_FILES 数据传递到存储服务器。

 $data = array(
    'file' => new CURLFile($_FILES['file']['tmp_name'],$_FILES['file']['type'], $_FILES['file']['name']),
    'destination' => 'destination path in which file will be uploaded',
    'calling_method' => 'upload_file',
    'file_name' => 'file name, you want to give when upload will completed'
); 

**Note :CURLFile class will work if you have PHP version >= 5**

 $ch = curl_init();

curl_setopt($ch, CURLOPT_URL, PATH_FOR_THAT_PHP_FILE_ON_STORAGE_SERVER_FILE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60000);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_HOST']);

$response = curl_exec($ch);
if (curl_errno($ch)) {

    $msg = FALSE;
} else {
    $msg = $response;
}

curl_close($ch);
echo $msg;

通过使用CURL,可以调用存储服务器文件方法并上传文件,同样您也可以调用方法来删除文件。

希望这能有所帮助。


1
你可以使用谷歌搜索,有很多关于如何使用curl的教程。在你的情况下,你需要在两个服务器上开发两个部分:
  1. 接收表单,等待上传文件(接收者)
  2. curl上传脚本(发送者)
发送者脚本可能如下所示:
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file' => '@/path/to/file.txt'));
curl_setopt($ch, CURLOPT_URL, 'http://yoursecondserver.com/upload.php');
curl_exec($ch);
curl_close($ch);

如何在第二个服务器上接收文件,您可以在PHP手册中阅读,有很多例子http://php.net/manual/en/features.file-upload.php

如果您在服务器上安装了FTP连接,那么使用它可能会更容易。


0

首先,确保其他服务器接受您的连接,查找跨域策略问题。此外,请确保文件是公开可用的(即:您可以通过使用标准浏览器导航到URL来下载它)。

一旦设置好了一切,您可以使用file_get_contents获取文件内容,并使用file_put_contents将其保存在本地:

file_put_contents('file_name', file_get_contents('FILE_URL'));

您的其他问题(删除、编辑)实际上是不同的问题,最好单独处理,因为出于明显的安全原因,无法仅从您的网站服务器执行这些操作。您需要在存储服务器上公开一个API,并从网站访问该API,以使存储执行适当的操作。


0

您可以通过发布文件来将文件上传到另一个服务器。

$request = curl_init('http://example.com/');

// send a file
curl_setopt($request, CURLOPT_POST, true);
curl_setopt(
    $request,
    CURLOPT_POSTFIELDS,
    array(
      'file' => '@' . realpath('example.txt')
    ));

curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($request);

curl_close($request);

您可以使用 $_FILES['file'] 处理上传的文件。

0
在这种情况下,您可以使用本地服务器上文件的路径调用远程服务器上的PHP脚本。 然后在远程服务器上使用file_get_contents保存该文件。 本地服务器上的示例:
<?php
file_get_contents('http://somestaticfilesserver.com/download.php?file=path/to/some/file.png')

download.php可能看起来像这样:

<?php
$remoteHost = 'http://serversendingfile.com';
$rootPath = realpath(__DIR__) . DIRECTORY_SEPARATOR . 'uploaded' . DIRECTORY_SEPARATOR;
$filePath = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, filter_input_array(INPUT_GET)['file']);
$fileName = (basename($filePath));
$remoteFile = $remoteHost . $filePath;
$file = file_get_contents($remoteFile);
$absolutePath = str_replace($fileName, '', $rootPath . $filePath);
if (!is_dir($absolutePath)) {
    mkdir($absolutePath, 0777, true);
}
if (file_put_contents($absolutePath . $fileName, $file, FILE_APPEND)) {
    die('ok');
}
die('nok');

给定的路径将相对于$rootPath保持不变


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