web-dev-qa-db-fra.com

PHP: télécharger un fichier d'un serveur sur un autre

Je développe un site Web sur un serveur et le stockage est sur un autre serveur et je dois gérer cela d'une façon ou d'une autre. Je ressens nerveusement cette affaire et j’ai trouvé que la solution consistait à utiliser curl.

Veuillez m'expliquer comment utiliser Curl en détail à partir de zéro.

Mettre à jour:

J'utilise le code suivant pour tester si cURL est installé et activé:

<?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;
  }
}
?>

Voici le résultat:  enter image description here

Et j'ai reçu un message (Page trouvée)

Maintenant, je peux utiliser cURL sans souci, non?

Remarque: Les deux serveurs sont locaux

6
Learner

En tant que développeur PHP, vous connaissez peut-être déjà la fonction la plus pratique du système de fichiers de PHP, fopen. La fonction ouvre un flux de fichiers et renvoie une ressource qui peut ensuite être transmise à fread ou fwrite pour lire ou écrire des données. Certaines personnes ne réalisent pas cependant que la ressource de fichier ne doit pas nécessairement pointer vers un emplacement sur la machine locale.

Voici un exemple de transfert d'un fichier du serveur local vers un serveur ftp:

$file = "filename.jpg";
$dest = fopen("ftp://username:[email protected]/" . $file, "wb");
$src = file_get_contents($file);
fwrite($dest, $src, strlen($src));
fclose($dest); 

Vous trouverez une liste des différents protocoles pris en charge à l’Annexe M du manuel PHP. Vous souhaiterez peut-être utiliser un protocole utilisant un mécanisme de cryptage tel que FTPS ou SSH en fonction de la configuration du réseau et de la sensibilité des informations que vous transférez.

L'extension curl utilise la bibliothèque d'URL client (libcurl) pour transférer des fichiers. La logique de mise en œuvre d'une solution curl est généralement la suivante: initialisez d'abord une session, définissez les options de transfert souhaitées, effectuez le transfert, puis fermez la session.

L'initialisation de la session curl se fait avec la fonction curl_init. La fonction retourne une ressource que vous pouvez utiliser avec les autres fonctions curl, tout comme la manière dont une ressource est obtenue avec fopen dans les fonctions du système de fichiers.

La destination de téléchargement et d'autres aspects de la session de transfert sont définis à l'aide de curl_setopt, qui utilise la ressource curl, une constante prédéfinie représentant le paramètre et la valeur de l'option.

Voici un exemple de transfert d'un fichier de l'hôte local vers un serveur distant à l'aide de la méthode PUT du protocole HTTP:

$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); 

Une liste des options valides pour curl se trouve dans la documentation php.

L'extension ftp vous permet d'implémenter l'accès client aux serveurs ftp. Utiliser ftp pour transférer un fichier est probablement excessif lorsque des options telles que les deux précédentes sont disponibles ... idéalement, cette extension serait mieux utilisée. Des fonctionnalités plus avancées sont nécessaires.

Une connexion est établie avec le serveur FTP à l'aide de ftp_connect. Vous authentifiez votre session avec le serveur FTP à l'aide de ftp_login en lui fournissant un nom d'utilisateur et un mot de passe. Le fichier est placé sur le serveur distant à l'aide de la fonction ftp_put. Il accepte le nom du fichier de destination, le nom du fichier source local et une constante prédéfinie pour spécifier le mode de transfert: FTP_ASCII pour le transfert de texte brut ou FTP_BINARY pour un transfert binaire. Une fois le transfert terminé, ftp_close est utilisé pour libérer la ressource et mettre fin à la session ftp.

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

Nous utilisons le même cas d'utilisation que vous. nous avons deux serveurs: serveur d'applications et serveur de stockage. Là où les serveurs d'applications contiennent des méthodes et une partie d'interface utilisateur, le serveur de stockage est l'endroit où nous téléchargeons les fichiers. Nous utilisons ce qui suit pour le téléchargement de fichiers, qui fonctionne correctement:

1) Vous devez ajouter un fichier php contenant les méthodes suivantes sur votre serveur de stockage:

<?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) Sur votre serveur d'applications.

Créez une méthode qui transmettra les données $ _FILES au serveur de stockage.

 $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;

De cette façon, en utilisant CURL, la méthode de fichier du serveur de stockage sera appelée et les fichiers téléchargés. De la même manière, vous pouvez appeler la méthode pour supprimer le fichier.

J'espère que cela aidera.

4
Shivani Patel

Tout d'abord, désolé pour mon mauvais anglais Je crée une autre méthode avec n'utilisez pas cURL et utilisePOST:

uploader.php

<form method="POST" action="//uploadfile.php" enctype="multipart/form-data">
// SETS THE MAX FILE SIZE (in bytes)
   <input type="hidden" name="MAX_FILE_SIZE" value="2097152" />
// SETS THE FILE NAME
   <input type="hidden" name="nam"    value="myfile" />
// SETS THE FOLDER NAME
   <input type="hidden" name="f"      value="ups" /><br>
// SETS THE RETURN PAGE NOTE: the file will return on the end, so will be view.php?img=myfile.png
   <input type="hidden" name="r"      value="view.php?img=" />
// SETS THE ERROR PAGE, so if error is 2, will return fileupload.php?error=2 (you can see all error codes in http://php.net/manual/pt_BR/features.file-upload.errors.php)
   <input type="hidden" name="e"      value="fileupload.php?error=" />
   <input type="file"   name="file">
   <input type="submit" name="upload" value="Upload">
</form>

uploadfile.php

<?php
if(isset($_POST['upload'])){
  echo "<h1><font face='Arial'><b>Wait. . .</font></h1>";
  $filname    = $_POST['nam'] . strrchr($_FILES['file']['name'], '.');
  $uploaddir  = '$_POST['f'] . '/' . $filname;

  if(move_uploaded_file($_FILES['file']['tmp_name'], $uploaddir)){
    echo "<script> location.href='" . $_POST['r'] . $filname . "'; </script>";
  } else {
    echo "<script> location.href='" . $_POST['e'] . $_FILES['file']['error'] . "'; </script>";

  }
}
 ?>

ATTENTION: il n'a pas 100% de sécurité, si d'autres personnes créent uploader.php avec ce code, il peut également télécharger.

J'espère être utile

2
Matheus Dias

Dans ce cas, vous pouvez appeler le script PHP sur le serveur distant avec le chemin d'accès au fichier sur le serveur local. Ensuite, sur le serveur distant à l'aide de file_get_contents, enregistrez le fichier. Exemple sur le serveur local:

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

et download.php peut ressembler à ceci:

<?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');

le chemin donné sera conservé par rapport à $ rootPath

0
Marcin Żurek

Tout d’abord, assurez-vous que l’autre serveur acceptera vos connexions, recherchez les problèmes de stratégie interdomaine. Assurez-vous également que le fichier est accessible au public (c.-à-d. Que vous pouvez le télécharger en naviguant vers l'URL avec un navigateur standard).

Une fois que tout est configuré, vous pouvez utiliser file_get_contents pour obtenir le contenu du fichier et file_put_contents pour le sauvegarder localement:

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

Vos autres questions (supprimer, modifier) ​​sont vraiment différentes et devraient probablement être traitées dans leurs propres questions, car il n’existe aucun moyen de le faire à partir du serveur de votre site Web uniquement pour des raisons de sécurité évidentes. pour exposer une API sur le serveur de stockage et appuyer sur cette API du site Web pour que le stockage effectue les actions appropriées.

0
Growiel

Vous pouvez télécharger le fichier sur un autre serveur à l'aide de la publication du fichier. 

$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);

Vous pouvez gérer le fichier téléchargé en utilisant $ _FILES ['file']

0
Mitul

Vous pouvez google, il y a beaucoup de tutoriels sur la façon de travailler avec curl. Dans votre cas, vous devez développer deux parties sur les deux serveurs:

  1. formulaire de réception, qui attend le téléchargement du fichier (destinataire)
  2. script d'envoi curl (expéditeur)

Le script d'envoi peut être similaire:

$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);

Comment recevoir un fichier sur le deuxième serveur, consultez le manuel PHP, de nombreux exemples http://php.net/manual/en/features.file-upload.php

Vous pouvez éventuellement utiliser connexion FTP , si vous l'avez installée sur vos serveurs, cela pourrait être encore plus simple. 

0
Farside