Envoi d'images à partir d'une Toile éléments à l'aide d'Ajax et PHP $_FILES

J'ai besoin d'être en mesure d'envoyer une image et quelques champs de formulaire à partir d'un côté de client de toile élément à un script PHP, et finir dans les $_POST et $_FILES. Lorsque j'envoie comme ceci:

<script type="text/javascript">
var img = canvas.toDataURL("image/png");
...
ajax.setRequestHeader('Content-Type', "multipart/form-data; boundary=" + boundary_str);
var request_body = boundary + '\n' 
+ 'Content-Disposition: form-data; name="formfield"' + '\n' 
+ '\n' 
+ formfield + '\n' 
+ '\n' 
+ boundary + '\n'
+ 'Content-Disposition: form-data; name="async-upload"; filename="' 
+ "ajax_test64_2.png" + '"' + '\n' 
+ 'Content-Type: image/png' + '\n' 
+ '\n' 
+ img
+ '\n' 
+ boundary;
ajax.send(request_body);
</script>

$_POST et $_FILES à la fois de revenir peuplée, mais les données de l'image dans la variable $_FILES encore à décoder comme ceci:

$loc = $_FILES['async-upload']['tmp_name'];
$file = fopen($loc, 'rb');
$contents = fread($file, filesize($loc));
fclose($file);
$filteredData=substr($contents, strpos($contents, ",")+1);
$unencodedData=base64_decode($filteredData);

...afin de l'enregistrer en tant que lisible PNG. Ce n'est pas une option que je suis en train de passer de l'image de WordPress, media_handle_upload() de la fonction, ce qui implique un indice de la variable $_FILES pointant vers une image lisible. Je ne peux pas décoder, enregistrer et modifier 'tmp_name' en conséquence, comme il échappe à tout contrôle de sécurité.

Donc, j'ai trouvé ceci:
http://www.webtoolkit.info/javascript-base64.html
et a essayé de faire le décoder sur le côté client:

img_split = img.split(",",2)[1];
img_decoded = Base64.decode( img_split );

mais pour une raison que je n'ai toujours pas retrouver avec un fichier lisible quand il arrive à l'PHP.
Donc la question est: "Pourquoi?" ou "Ce que je fais mal?" ou "Est-ce même possible?" 🙂

Toute aide grandement appréciée!

Grâce,
Kane

  • J'avais mis un Content-Transfer-Encoding: base64 & regardez cette réponse perdre le préfixe n'ai pas testé si.
  • Content-Transfer-Encoding, bien que valide d'un en-tête MIME, n'est pas valide en-tête HTTP. Voir cette annexe de la spec.
  • Accusé de réception de mon erreur. Se fait-il que je n'ai jamais eu besoin de créer manuellement un fichier à télécharger 🙂
  • vous n'êtes pas le seul. C'est tout nouveau et le monde déroutant pour moi 🙂