Мне нужно иметь возможность отправлять изображения и некоторые поля формы из элемента canvas на стороне клиента в PHP script, заканчивая $_POST и $_FILES. Когда я отправлю его вот так:
<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 и $_FILES возвращаются, но данные изображения в $_FILES все еще нуждаются в декодировании следующим образом:
$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);
..., чтобы сохранить его как читаемый PNG. Это не вариант, поскольку я пытаюсь передать изображение в функцию Wordpress media_handle_upload(), для которой требуется индекс $_FILES, указывающий на читаемое изображение. Я также не могу декодировать, сохранять и изменять "tmp_name" соответственно, так как это подрывает проверки безопасности.
Итак, я нашел это: http://www.webtoolkit.info/javascript-base64.html и попытался выполнить декодирование на стороне клиента:
img_split = img.split(",",2)[1];
img_decoded = Base64.decode( img_split );
но по какой-то причине я до сих пор не получаю доступный для чтения файл, когда он попадает на PHP. Поэтому вопрос: "Почему?" или "Что я делаю неправильно?" или "Возможно ли это?": -)
Любая помощь очень ценится!
Спасибо, Кейн