2010-10-23 5 views
2

Je réception des fichiers (images) téléchargés avec l'Ajax dans mon script PHP et ont eu à travailler en utilisant ceci:en utilisant php: // entrée et file_put_contents

$input = fopen("php://input", "r"); 
file_put_contents('image.jpg', $input); 

Il est évident que je vais nettoyer l'entrée avant cette opération .

Une chose que je voulais vérifier était la taille du fichier avant de créer le nouveau fichier, comme suit:

$input = fopen("php://input", "r"); 
$temp = tmpfile(); 
$realsize = stream_copy_to_stream($input, $temp); 
if ($realsize === $_SERVER["CONTENT_LENGTH"]) { 
    file_put_contents('image.jpg', $temp); 
} 

Et cela ne fonctionne pas. Le fichier est créé, mais il a une taille de 0 octet, donc le contenu n'est pas mis dans le fichier. Je ne suis pas très familier avec l'utilisation des flux, mais je ne vois pas pourquoi cela ne devrait pas fonctionner, alors je me tourne vers vous pour obtenir de l'aide. Merci d'avance!

+1

Comment téléchargez-vous exactement dans le navigateur Web? Normalement, vous souhaitez utiliser l'encodage de formulaire 'multipart/form-data', puis récupérer le fichier téléchargé par' $ _FILES'. Avec 'php: // input', vous indiquez que le fichier doit couvrir le corps de la requête ENTIER. Cela suggère que vous utilisez une approche propriétaire pour télécharger le fichier dans webbrowser. Une applet personnalisée peut-être? – BalusC

+0

Je suis en train de lire la collection 'files' de l'élément' ', et d'envoyer simplement le' file' via la méthode XHR 'send()'. Il n'y a pas de '

' en cours d'utilisation, car je ne veux pas utiliser les iframes. Ceci est uniquement supporté par Firefox et Chrome (pas sûr de Safari) pour le moment. – Rafael

+0

Veuillez activer le rapport d'erreurs et les erreurs d'affichage. – NikiC

Répondre

4

La solution était trompeusement simple:

$input = fopen("php://input", "r"); 
file_put_contents($path, $input); 
+0

cette méthode est-elle considérée comme sûre? – astroanu

1

Vous utilisez des ressources de fichier comme s'il s'agissait de chaînes. Au lieu de cela, vous pouvez à nouveau utiliser stream_copy_to_stream:

stream_copy_to_stream($temp, fopen('image.jpg', 'w')); 
+0

Merci pour votre suggestion, mais je viens d'essayer et ça ne marche pas. – Rafael

+0

L'erreur était: Avertissement: file_get_contents() s'attend à ce que le paramètre 1 soit une chaîne, ressource donnée. – Rafael

+0

@Rafael: J'ai édité ma réponse;) – NikiC