jQuery上传进度和AJAX文件上传


72

看来我还没有清楚地传达我的问题。我需要发送一个文件(使用AJAX),并且需要使用Nginx HttpUploadProgressModule获取文件的上传进度。我需要一个很好的解决方案。我已经尝试过使用jquery.uploadprogress插件,但是我发现自己不得不重写其中的大部分内容,以使其在所有浏览器中都能正常工作并使用AJAX发送文件。

我所需要的只是执行此操作的代码,它需要在所有主要的浏览器(Chrome,Safari,FireFox和IE)中运行。如果我能找到可以处理多个文件上传的解决方案,那就更好了。

我正在使用jquery.uploadprogress插件从NginxHttpUploadProgressModule获取文件的上传进度。这是在Facebook应用程序的iframe中。它可以在Firefox中使用,但不能在chrome / safari中使用。

当我打开控制台时,我得到了。

Uncaught ReferenceError: progressFrame is not defined
jquery.uploadprogress.js:80

知道我该如何解决吗?

我还想在完成后使用AJAX发送文件。我将如何实施?

编辑:
我很快需要这个,这很重要,所以我要在这个问题上悬赏100分。第一个回答的人将获得100分。

编辑2:
Jake33帮助我解决了第一个问题。第一个对如何使用ajax发送文件做出回应的人也将获得100分。


2
我看到它使用浏览器嗅探来检测Safari(浏览器嗅探通常被禁止),因此progressFrame仅与Safari / Chrome一起使用(我不知道为什么)。发生错误的部分似乎是脚本尝试通过仅在全局范围内查找其名称而不是使用诸如之类的函数来引用progressFrame的地方document.getElementsByName
jhartz

1
我不确定“完成时使用AJAX发送”是什么意思-进度条是否代表提交进度?这不是说一旦完成就已经发送了吗?您是说要原始表单提交由AJAX驱动,以便以后不会刷新页面吗?
slifty 2011年

是。是的,但是就像表单提交一样。那正是我想要的。
2011年

如果问题是如何使用jQuery通过XMLHttpRequest通过HTTP POST发送数据,那么这里有jQuery.post
karlcow 2011年

1
以下答案对您有用吗?如果没有,您能否评论答案。由于进行了所有修改,我有些困惑,并想尝试解决您的问题。谢谢。顺便说一句,我包括了JQuery的多文件上传插件的链接。
jmort253 2011年

Answers:


214

这些天实际上可以使用AJAX上传文件。是的,AJAX,而不是诸如SWF或Java之类的cr脚的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);

filetypeof在哪里Blobhttp : //www.w3.org/TR/FileAPI/

另一种(更好的IMO)方法是使用FormData。这样一来,您可以1)以格式的形式命名文件,以及2)以格式的形式发送其他内容(文件也是如此)。

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中处理请求的方式(每个请求1张图片):

if ( isset($_FILES['file']) ) {
    $filename = basename($_FILES['file']['name']);
    $error = true;

    // Only upload if on my home win dev machine
    if ( isset($_SERVER['WINDIR']) ) {
        $path = 'uploads/'.$filename;
        $error = !move_uploaded_file($_FILES['file']['tmp_name'], $path);
    }

    $rsp = array(
        'error' => $error, // Used in JS
        'filename' => $filename,
        'filepath' => '/tests/uploads/' . $filename, // Web accessible
    );
    echo json_encode($rsp);
    exit;
}

27
有关完整的兼容性列表,此功能仅在XMLHttpRequest2中可用-请查看caniuse.com/xhr2
YS。

@Rudie您是否拥有hotblocks.nl教程链接?不只是演示,感谢广告
vzhen

没有教程。从来没有写过。甚至都没有将演示内容公开。
鲁迪

1
@NeilMartin我在答案的末尾添加了PHP示例代码。显然,您将需要对其进行其他操作。
鲁迪(Rudie)2013年

1
我不确定我是否知道如何进行这项工作?如果您可以制作一个完整的工作示例并在某个地方在线进行演示,那将是很棒的。或关于如何使其工作以及正在做什么的一些指导?
drooh

17

以下是一些使用AJAX上传文件的选项:

更新: 这是用于多文件上传的JQuery插件。


2
我在几个成功的项目中使用了plUpload(具有进度的多文件上传,支持Flash / Html5 / Silverlight等)
Guillaume86

1
AjaxFileUpload有点废话。它与任何低于1.5的jquery版本都不兼容。此外,该代码还很丑陋。
2012年

1
@Adam-很高兴知道。我想一年会有很多变化。我们的头发变灰了,JavaScript库停止使用较新的软件版本……
jmort253 2012年

1
为了扩展@ Adam,AjaxFileUpload在ie9 +
0plus1

1
@RanaMuhammadUsman-现在再看一遍。我相信我找到了移动插件的位置。希望这可以帮助。
jmort253 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.