Проблема состоит в том, что в Chromium или Opera нет метода sendAsBinary (только send) у XHR-объекта. В итоге в огнелисе всё загружается корректно, а в хромоногом и хропере приходят битые файлы, также вместо юникодных символов в имени файла — различная абракадабра.
Отрывок кода:
self._xhr.open('POST', self.params.url, true);
var boundary = 'xxxxxxxxx';
self._xhr.setRequestHeader('Content-Type', 'multipart/form-data, boundary='+boundary);
self._xhr.setRequestHeader('Cache-Control', 'no-cache');
self._xhr.setRequestHeader('Pragma', 'no-cache');
self._xhr.setRequestHeader('Expires', '0');
var body = '';
// the file
body += '--' + boundary + '\r\n';
body += 'Content-Disposition: form-data; charset: utf-8; accept-charset: utf-8'+
'; name="'+ self.params.fileFieldName +'"'+
'; filename="'+ unescape(encodeURIComponent( self.params.file.name )) +'"\r\n';
body += 'Content-Type: application/octet-stream\r\n\r\n';
body += self._reader.result + '\r\n'; // self._reader is instanceof FileReader
// custom data
for (var key in self._toPost) {
body += '--' + boundary + '\r\n';
body += 'Content-Disposition: form-data; name="'+ key +'"\r\n';
body += 'Content-Type: text/plain; charset=utf-8\r\n\r\n';
body += self._toPost[key].toString() + '\r\n';
}
body += '--' + boundary + '--';
if (self._xhr.sendAsBinary) {
// firefox
self._xhr.sendAsBinary(body);
} else {
// chrome (W3C spec.)
self._xhr.send(body);
}
Как в такой ситуации действовать? Спасибо.