当前位置: 首页 > 面试题库 >

jQuery上传进度和AJAX文件上传

寿嘉悦
2023-03-14
问题内容

看来我还没有清楚地传达出我的问题。我需要发送一个文件(使用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分。


问题答案:

这些天实际上可以使用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 在哪里Blob:http :
//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;
}


 类似资料:
  • 问题内容: 我可以使用以下jQuery代码使用ajax请求的POST方法执行文件上传吗? 如果可能,我是否需要填写部分?这是正确的方法吗?我只将文件发布到服务器端。 我一直在搜索,但是我发现是一个插件,而在我的计划中我不想使用它。至少目前是这样。 问题答案: 上传文件是 不是 有可能通过AJAX。 您可以使用来上传文件,而无需刷新页面。 更新 使用XHR2,支持通过AJAX上传文件。例如通过对象,

  • 问题内容: 我有上传表格,允许用户上传多个文件。我决定,如果文件很大,则进度条会很好。下面是我的源代码。我是jQuery的新手,通常我只会使用php,但是我发现ajax更加用户友好。 图像上传正常,数组发送到ajax,但进度条不动。实际上,调用这两个函数的console.log都不会产生这种情况。有没有正确的方法来调用我的ajax请求中的函数,以使此进度条正常工作。 beforeSubmit:be

  • 问题内容: 我希望在用户使用$ .ajax在输入文件中选择文件时异步上传文件。但是接收调用返回索引的PHP未定义。jQuery代码是下一个: 以及调用该调用的php: 谢谢 问题答案: 您无法使用AJAX上传文件,但可以使用,因此不必刷新当前页面。 很多人都对插件束手无策,但您可以轻松完成此操作,并具有AJAX请求的所有功能。 不必使用AJAX函数,而是将表单提交到具有事件处理程序的隐藏文件中,以

  • 问题内容: 我已经尝试上传一个简单的文本文件了几个小时,但似乎仍然无法正常工作。 我不断收到无效的表格,说我缺少“ file_source”。 为什么“ file_source”没有发布? 我还可以发送“ file_source”,但是它仍然说它丢失了。应该为Django FileFiled提供哪种类型的元素? Django表格: Django模板(呈报形式): jQuery / Ajax上传:

  • 问题内容: 我想在我的Intranet页面上实现一个简单的文件上传,并使用最小的设置。 这是我的HTML部分: 这是我的JS jQuery脚本: 网站的根目录中有一个名为“ uploads”的文件夹,具有“用户”和“ IIS_users”的更改权限。 当我选择具有文件格式的文件并按下上载按钮时,第一个警报将返回“ [object FormData]”。第二个警报不会被调用,“上传”文件夹也为空!

  • 我想在我的内联网页面中实现一个简单的文件上传,尽可能使用最小的设置。 这是我的HTML部分: 这是我的JS jquery脚本: 在网站的根目录中有一个名为“uploads”的文件夹,具有“users”和“IIS_users”的更改权限。 当我使用文件表单选择一个文件并按下上载按钮时,第一个警报返回“[object FormData]”。第二个警报未被调用,“上载”文件夹也为空!? 有人能帮我找出问