2009-10-29 5 views
1

Je développe un script PHP pour envoyer le contenu d'un fichier d'un script à un autre. En PHP, il utilise généralement le tableau $ _FILE qui contient n'importe quel fichier envoyé dans un formulaire. Mais je ne l'ai pas eu besoin d'une forme, donc je suis venu avec quelque chose d'un peu différent:

// pseudo function names ahead 

$content = file_get_contents(FILE_TO_SEND); 
send_file_with_curl(base64_encode(gzcompress($content))); 

Donc, ce récupère essentiellement le contenu du fichier, puis le comprime avec une compression gzip puis base64 encode. Ensuite, tout est envoyé avec une requête cURL POST. De l'autre côté je reçois le contenu base64 décodé, décompressé et tout revient intacte. Donc, ma question est la suivante: Y a-t-il des inconvénients à faire les choses de cette façon? Y a-t-il des problèmes de sécurité ou d'intégrité que je pourrais négliger?

J'ai oublié de mentionner que j'envoie également un condensé md5 du fichier pour vérifier si le transfert s'est bien passé. Et les fichiers à envoyer ne seront jamais plus de 3Mb de taille.

Merci d'avance pour toutes vos réponses.

Répondre

3

J'ai trouvé que la méthode HTTP PUT est agréable pour ce genre de choses. Vous n'avez sûrement pas besoin d'encoder le fichier, et probablement ne devrait pas vous embêter avec la compression, etc ... Il n'y a pas de limite de taille pratique à ce qui suit. Il est rapide et utilise une quantité de mémoire fixe quelle que soit la taille du fichier.


Cette fonction HTTP PUT un fichier à partir du disque local vers une URL distante

//Specify the location of a tmp file 
function PutFile($sName, $sFile) 
{ 
    $URL = "http://MY-SERVER/PutFile.php?FileName=" . urlencode($sName); 

    $FILE = fopen($sFile, 'rb'); 

    $curl = curl_init($URL); 
    curl_setopt($curl, CURLOPT_HEADER,0); 
    curl_setopt($curl, CURLOPT_PUT, 1); 
    curl_setopt($curl, CURLOPT_INFILE, $FILE); 

    ob_start(); 
     curl_exec($curl); 
     $sReturn = ob_get_contents(); 
    ob_end_clean(); 

    curl_close($curl); 

    fclose($FILE); 

    return $sReturn; 
} 

Sur l'extrémité distante, c'est PutFile.php

<?php 

$Name = (get and **validate** file name from $_GET['FileName']; 
$Path = /somewhere/to/put/the/file/ + $Name 

set_time_limit(3); 

$f1 = fopen('php://input', 'rb'); 
$f2 = fopen($Path, 'wb'); 

while($data = fread($f1, 4096)) 
{ 
    fwrite($f2, $data); 
} 

fclose($f1); 
fclose($f2); 

echo "Success\n"; 

Si vous ne voulez pas l'écrire sur le disque, mais que vous l'utilisez en mémoire, vous pouvez simplement utiliser file_get_contents('php://stdin')

1

Un inconvénient possible est que le codage base64 augmente considérablement la taille de transfert globale. La compression va aider, mais base64 va ajouter 33% de surcharge sur la taille du fichier compressé. En dehors de cela, je ne pense pas qu'il y aura une grande différence entre les deux méthodes.

+3

Comme je l'ai noté à Frank, base64 ajoute exactement 33%. Il code 3 octets comme 4. Il n'y a aucune conjecture ici. –

0

Ce codage en base64 augmente votre taille de fichier de 33% (selon le commentaire ci-dessous). En outre, vous devez charger le fichier entier en mémoire en une seule fois.

Si vous avez utilisé la méthode normale de téléchargement de fichiers, aucun de ces problèmes ne devrait poser problème.

+1

base64 a une surcharge constante. Votre fichier augmente de taille de 33%. C'est aussi simple et prévisible que ça. Dire qu'il augmente 'plusieurs fois' est trompeur et incorrect. –

+0

Assez juste. Éditera pour refléter cela. –