2010-10-03 20 views
0

Le téléchargement de fichiers via la méthode PUT, même binaire ou texte, via un "navigateur Web normal" est possible. Pourquoi beaucoup de gens disent juste que ce n'est pas possible?Télécharger des fichiers de façon asynchrone (AJAX) avec la méthode HTTP/1.1 PUT, pourquoi pas?

Exemple de code avec jQuery et PHP.

$(document).ready(function() { 
    $("#uploadbutton").click(function() { 
     var filename = $("#file").val(); 
     $.ajax({ 
     type: "PUT", 
     url: "addFile.do", 
      enctype: 'multipart/form-data', 
      data: {file: filename}, 
      success: function(){ 
       alert("Data Uploaded: "); 
      } 
     });  
    }); 
}); 

Du côté du serveur de lire le flux STDIN comme

<?php 
/* PUT data comes in on the stdin stream */ 
$putdata = fopen("php://input", "r"); 

/* Open a file for writing */ 
$fp = fopen("myputfile.ext", "w"); 

/* Read the data 1 KB at a time 
    and write to the file */ 
while ($data = fread($putdata, 1024)) 
    fwrite($fp, $data); 

/* Close the streams */ 
fclose($fp); 
fclose($putdata); 
?> 
+2

Quelle est votre question? –

Répondre

0

Pour votre solution spécifique, principalement parce que la méthode PUT (verbe) ne sont pas pris en charge par tous les navigateurs, les plus âgés en particulier, cette solution ne fonctionnera pas pour tout le monde.

The topic has come up previously as well, mais pas exactement la même chose, certaines réponses sont des exemples où PUT et DELETE ne fonctionnent pas.

The documentation for $.ajax() mentions this as well:

Type
Par défaut: 'GET'
Le type de demande de faire ("POST" ou "GET"), par défaut est "GET".

Remarque: D'autres méthodes de requête HTTP, telles que PUT et DELETE, peuvent également être utilisées ici, mais elles ne sont pas prises en charge par tous les navigateurs.

0
{file: filename} 

Lorsque vous téléchargez un fichier, vous devez télécharger le fichier. Dire au serveur quel est le nom de fichier local n'est pas suffisant. JavaScript, s'exécutant dans un navigateur Web dans un contexte de sécurité standard, n'a pas accès à la lecture des données contenues dans le fichier depuis le disque dur de l'utilisateur.

Puisque vous ne pouvez pas obtenir les données, vous ne pouvez pas les télécharger.

+1

Je pense que vous avez manqué le verbe HTTP 'PUT' ici, ça * fonctionne *, mais ce n'est pas aussi largement supporté que vous le feriez pour cette route. –

+0

N'est-ce pas juste un * second * obstacle au problème? – Quentin

+0

Non, c'est ainsi que 'PUT' fonctionne, pour être 100% correct, il devrait être:' addFile.do/filename', mais le problème est principalement le support ... bien que oui son implémentation actuelle ne fonctionnerait pas en dehors de PHP, à moins sur tout cadre que je peux penser jusqu'à ce que l'URL est corrigée. En ce qui concerne le contexte de la question, le problème est encore l'absence d'un large soutien pour l'approche des OP, plutôt que des limitations qui l'empêchent complètement ... bien qu'il y ait certainement une bonne dizaine de bonnes raisons de le faire. –