Post PHP:将文件从一台服务器上载到另一台服务器

Post PHP:将文件从一台服务器上载到另一台服务器,post,curl,file-upload,Post,Curl,File Upload,我在一台服务器上开发一个网站,而存储在另一台服务器上,我必须以某种方式处理这个问题。我经历过这种情况,我发现解决方法是使用curl 请向我详细解释如何从零开始使用旋度。 更新: 我使用以下代码测试是否安装并启用了cURL: <?PHP phpinfo(); $toCheckURL = "http://board/accSystem/webroot/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $toCheckURL); 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了,对吧

注:
这两台服务器都是本地的

你可以在谷歌上搜索,有很多关于如何使用curl的教程。在您的情况下,需要在两台服务器上开发两个部分:

  • 接收表格,等待上传文件(接收者)
  • 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手册中阅读,有很多例子


    您可能希望使用FTP连接,如果将其安装在服务器上,可能会更容易

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

    设置完所有内容后,您可以使用获取文件内容并将其保存到本地:

    file\u put\u contents('file\u name',file\u get\u contents('file\u URL')

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

    您可以使用发布文件在另一台服务器上上载文件

    $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);
    
    您可以使用$\u FILES['file']处理上载的文件


    作为一名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会话。该函数返回可与其他curl函数一起使用的资源,就像在文件系统函数中使用fopen获得资源一样

    上传目的地和传输会话的其他方面是使用curl_setopt设置的,它接受curl资源,一个表示设置和选项的预定义常量™s值

    下面是一个使用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服务器提供用户名和密码,可以使用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); 
    

    我们和您一样使用相同的用例。我们有两个服务器:应用程序服务器和存储服务器。应用程序服务器包含方法和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;
    }
    ?>
    
    通过这种方式,使用CURL,它将调用存储服务器文件方法并上载文件,同样,您也可以调用方法来删除文件


    希望这会有所帮助。

    在这种情况下,您可以使用本地服务器上的文件路径在远程服务器上调用PHP脚本。 然后在远程服务器上使用文件获取内容保存文件。 本地服务器上的示例:

    <?php
    file_get_contents('http://somestaticfilesserver.com/download.php?file=path/to/some/file.png')
    

    更麻烦的是,我想检索上传的文件并查看、更新(用另一个文件替换)以及删除它:)我很想帮忙,但我想我们需要更多的信息。说你想通过curl从另一台服务器上检索一个文件并对其进行修改,这有点含糊不清。从技术上讲,第一个选项不是FTP吗?实际的FTP扩展又是如何过度使用的呢?
    
    <?php
    file_get_contents('http://somestaticfilesserver.com/download.php?file=path/to/some/file.png')
    
    <?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');