我正在使用html5 slice和webworker但是当它转到uploadFile函数时,什么也没发生。没有上传
<html>
<head>
<title>Upload Files using XMLHttpRequest</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
</head>
<body>
<form id="fileuploader" enctype="multipart/form-data" method="post" action="upload.php">
<label for="fileToUpload">Select Files to Upload</label><br />
<input type="file" name="fileToUpload[]" multiple="" id="fileToUpload" onchange="fileList();"/><br />
<input type="button" onclick="sendRequest();" value="Upload" />
<!-- a place for File Listing -->
<div id="fileList">
</div>
</form>
</body>
</html>
<script type="text/javascript">
function sendRequest() {
var worker = new Worker("fileupload.js");
worker.onmessage = function(e) {
alert(e.data);
}
var file = document.getElementById('fileToUpload');
for(var i = 0; i < file.files.length; i++) {
worker.postMessage(file.files[i]);
}
}
和fileupload.js
var file;
var p = true;
function uploadFile(blobFile, fileName, filePart, totalChunks) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "upload.php"+"?"+"file="+fileName + filePart, true);
xhr.onload = function(e) {
};
xhr.send(blobFile);
}
function process() {
var blob = file;
var originalFileName = blob.name;
var filePart = 0
const BYTES_PER_CHUNK = 100 * 1024 * 1024; // 100MB chunk sizes.
var realFileSize = blob.size;
var start = 0;
var end = BYTES_PER_CHUNK;
totalChunks = Math.ceil(realFileSize / BYTES_PER_CHUNK);
while( start < realFileSize ) {
//self.postMessage(start);
//self.postMessage("test");
var chunk = blob.slice(start, end);
uploadFile(chunk, originalFileName, filePart, totalChunks);
filePart++;
start = end;
end = start + BYTES_PER_CHUNK;
}
}
self.onmessage = function(e) {
file = e.data;
/*for (var j = 0; j < e.data.length; j++) {
files.push(e.data[j]);
}*/
if (p) {
process();
}
}
答案 0 :(得分:1)
总结一下你的代码:
if (!blob.webkitSlice && !blob.mozSlice) {
var chunk = blob.mozSlice(start, end);
// or: var chunk = blob.webkitSlice(start, end);
}
这是你从中得到错误的那一行,很明显你需要在那里得到一个例外。
当然,对于那些浏览器的旧版本,您可能应该检查前缀函数。但是如果“特征”检测不匹配,则需要使用普通函数 - 可能是因为这些供应商已经删除了前缀,或者代码是在其他浏览器(Opera,IE)中执行的。另请参阅Browser compatibility: Notes on the slice() implementations at MDN。
所以,请使用:
var slice = blob.webkitSlice || blob.mozSlice || blob.slice;
var chunk = slice.call(blob, start, end);