У меня проблемы со скриптом загрузки файла перетаскивания в Firefox 7/8.Я написал базовый скрипт для загрузки файлов, помещенных в DropZone HTML-документа, в серверный скрипт «save.php».полный HTML, включая JavaScript, можно найти ниже.серверная часть не является проблемой, и поэтому я ее пропустил (save.php).
Я искал и пробовал все, но теперь я действительно застрял.скрипт запускается в Firefox 6, а также в Chrome без каких-либо ошибок JavaScript, когда я отбрасываю файл для загрузки (более того, файл правильно сохраняется на сервере, вызывающем save.php).но в ff7 / 8 я получаю следующую ошибку в консоли Firebug, когда я отбрасываю файл в зону сброса для загрузки:
Компонент возвратил код ошибки: 0x80460001 (NS_ERROR_CANNOT_CONVERT_DATA) this.send (ui8a.buffer);newfu.html (строка 105)
Может кто-нибудь сказать мне, что я делаю неправильно?это ошибка Firefox 7/8?тогда почему он работает в chrome и firefox 6?
является ли строка, которую я посылаю в xhr.send (), неправильно закодирована?
Большое спасибо за любую помощь!
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>cross browser drag and drop file upload example</title>
<script language="javascript" type="text/javascript" src="../js/jquery/js/jquery-1.6.4.min.js"></script>
<script>
// add the dataTransfer property for use with the native `drop` event
// to capture information about files dropped into the browser window
jQuery.event.props.push("dataTransfer");
$(function() {
$('#dropzone').bind("drop",function(evnt) {
evnt.stopPropagation();
evnt.preventDefault();
var data = evnt.dataTransfer;
for (var i = 0; i < data.files.length; i++) {
var file = data.files[i];
var boundary = '------multipartformboundary' + (new Date).getTime();
var dashdash = '--';
var crlf = '\r\n';
// Build RFC2388 string
var builder = '';
var builder2 = '';
builder += dashdash;
builder += boundary;
builder += crlf;
// generate headers
builder += 'Content-Disposition: form-data; name="user_file[]"';
if (file.fileName) {
builder += '; filename="' + file.fileName + '"';
}
builder += crlf;
builder += 'Content-Type: application/octet-stream';
builder += crlf;
builder += crlf;
//
// binary data string in FileReader's onload (see below)
//
builder2 += crlf;
//write boundary
builder2 += dashdash;
builder2 += boundary;
builder2 += crlf;
// mark end of the request
builder2 += dashdash;
builder2 += boundary;
builder2 += dashdash;
builder2 += crlf;
// setup filereader: read file and send it
reader = new FileReader();
reader.onload = function(evt) {
binary = evt.target.result;
var xhr = new XMLHttpRequest();
xhr.open("POST", "save.php", true);
xhr.setRequestHeader('content-type', 'multipart/form-data; boundary=' + boundary);
//sendAsBinary: deprecated Mozilla only, define NEWsendAsBinary and use it in all browsers
if(!XMLHttpRequest.prototype.NEWsendAsBinary){
XMLHttpRequest.prototype.NEWsendAsBinary = function(datastr) {
function byteValue(x) {
return x.charCodeAt(0) & 0xff;
}
var ords = Array.prototype.map.call(datastr, byteValue);
var ui8a = new Uint8Array(ords);
this.send(ui8a.buffer);
}
}
xhr.NEWsendAsBinary(builder+binary+builder2);
};
//read binary data
reader.readAsBinaryString(file);
}
return false;
}).bind ("dragover",function(evt) {
evt.stopPropagation();
evt.preventDefault();
$(this).css({
border: '1px solid #ff0000'
});
return false;
});
});
</script>
</head>
<body>
<div id="dropzone">
<p>Drop Files Here</p>
</div>
</body>
</html>