现在使用AJAX上传文件是可行的。没错,就是AJAX,而不是类似swf或java这样的不靠谱的模拟AJAX。
以下示例可能对你有帮助:https://webblocks.nl/tests/ajax/file-drag-drop.html
(它还包括拖放界面,但可以轻易地忽略它。)
基本上,它归结为以下内容:
<input id="files" type="file" />
<script>
document.getElementById('files').addEventListener('change', function(e) {
var file = this.files[0];
var xhr = new XMLHttpRequest();
(xhr.upload || xhr).addEventListener('progress', function(e) {
var done = e.position || e.loaded
var total = e.totalSize || e.total;
console.log('xhr progress: ' + Math.round(done/total*100) + '%');
});
xhr.addEventListener('load', function(e) {
console.log('xhr upload complete', e, this.responseText);
});
xhr.open('post', '/URL-HERE', true);
xhr.send(file);
});
</script>
(演示:http://jsfiddle.net/rudiedirkx/jzxmro8r/)
基本上,它归结为这个 =)
xhr.send(file);
当file
的类型为Blob
时,可以参考http://www.w3.org/TR/FileAPI/
另一种(我认为更好的)方法是使用FormData
。这允许您命名一个文件,就像在表单中一样,并且可以像在表单中发送其他东西(包括文件)。
var fd = new FormData;
fd.append('photo1', file);
fd.append('photo2', file2);
fd.append('other_data', 'foo bar');
xhr.send(fd);
FormData
使服务器端的代码更加清晰和向后兼容(因为请求现在与普通表单具有完全相同的格式)。
所有这些都不是实验性的,而是非常现代化。Chrome 8+ 和 Firefox 4+ 知道该如何处理,但我不知道其他浏览器。
以下是我在 PHP 中处理请求(每个请求一个图像)的方式:
if ( isset($_FILES['file']) ) {
$filename = basename($_FILES['file']['name']);
$error = true;
if ( isset($_SERVER['WINDIR']) ) {
$path = 'uploads/'.$filename;
$error = !move_uploaded_file($_FILES['file']['tmp_name'], $path);
}
$rsp = array(
'error' => $error,
'filename' => $filename,
'filepath' => '/tests/uploads/' . $filename,
);
echo json_encode($rsp);
exit;
}
document.getElementsByName
这样的函数来引用progressFrame的位置。 - jhartz