Собственно задача такая. Отправлять через Ajax форму с типом multipart/form-data, без использования jQuery. В форме находятся инпуты с файлами и пару полей. В конечном итоге Header'ы получается аналогичный.
Вот этот заголовок формируется через jQuery

А этот отправляю я
На сервере первый приходит с $_POST, во втором случае $_POST пустой. В чем причина понять не могу. Ведь отличие только в boundary (что в принципе и правильно)
Ну и на всякий случай код генерации аякса
generateBoundary = function() {
var MULTIPART_CHARS = "-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split('');
var buffer='';
for(var i = 1; i < 17; i++) {
var rand=(Math.random() * (MULTIPART_CHARS.length - 0) + 0)| 0;
buffer+=(MULTIPART_CHARS[rand]);
}
return buffer;
};
ajax = function ($obj) {
if(typeof $obj.type=='undefined') $obj.type="GET";
if(typeof $obj.data=='undefined') $obj.data=null;
var xmlhttp;var datax;
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open($obj.type,$obj.url,true);
datax=$obj.data;
if($obj.data!=null){
if($obj.type=="POST") {
var boundary=Math.random().toString().substr(2);
boundary="----WebKitFormBoundary"+generateBoundary();
xmlhttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+boundary );
var formData = new FormData();
var key; var attr;
for(key in $obj.files) {
if ($obj.files.hasOwnProperty(key)) {
attr = $obj.files[key];
formData.append(key, attr, attr.name);
}
}
for(key in $obj.data) {
if ($obj.data.hasOwnProperty(key)) {
attr = $obj.data[key];
console.log(key,"=>", attr);
formData.append('file-'+key, attr);
}
}
datax=formData;
}else{
datax=this.serialize($obj.data);
}
}
xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
var csrf=document.getElementsByName('csrf-token')[0];
if(csrf){
xmlhttp.setRequestHeader('X-CSRF-Token', csrf.getAttribute("content"));
}
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4){
switch (xmlhttp.status) {
case 200:
if(typeof $obj.success=='function'){
$obj.success(xmlhttp.responseText);
}
break;
default:
break;
}
}
};
xmlhttp.send(datax);
};