【问题标题】:File Upload event context and javascript文件上传事件上下文和 javascript
【发布时间】:2015-06-06 18:12:48
【问题描述】:

我需要有条件地打开文件上传对话框:

<input type="file" id="Upload">

基于来自服务器的 Ajax 响应。输入元素是隐藏的,因为我不希望显示默认的丑陋文件文本框和按钮。所以我有另一个元素,用户单击以启动上传。

从用户启动事件上下文的脚本中可以正常工作。

$('#Upload').click();

但是当 Ajax 调用的响应执行它时会失败。现在我知道出于安全考虑,这是 Firefox 和 Chrome 的设计,但在我的情况下,用户启动 ajax 调用,服务器需要决定服务器上的条件当前是否允许上传。如果是这样,我想打开文件上传对话框,否则我需要发布一条消息,说明由于 x 原因不允许该操作(由服务器返回)。

问题在于 Ajax 回调不在用户脚本上下文中,因此打开文件对话框(按设计)的 .click() 未执行。

还有什么办法可以解决这个问题?有没有办法捕获用户事件上下文并将其重用于 Ajax 调用的回调?

【问题讨论】:

  • 请把代码贴出来好吗?
  • 除了 "$('#Upload').click();" 之外没有其他代码可以显示我需要这段代码从 Ajax 回调中工作。适用于用户事件上下文,但不适用于 Ajax 回调。如果您可以从回调函数中执行该行脚本,那么您已经解决了我的问题。

标签: javascript jquery ajax file-upload


【解决方案1】:

要使用 JQuery 制作一个简单的上传器,请使用此代码

HTML

<form id="form" enctype="multipart/form-data">
    <input type="file" id="Upload"></br>
    <div class="progress">
        <div class="progress-bar progress-bar-info progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div>
    </div>
    <button type="submit">Start Upload</button>
</form>

您选择您的文件并在您确认上传后点击“开始上传”按钮

jQuery

$('#form').submit(function(){
    var data = new FormData(this);
    $.ajax({
        type: "POST",
        url: URL_TO_UPLOADER,
        data: data,
        contentType: false,
        cache: false,
        processData:false,
        beforeSend: function() {
            $(".progress-bar").width('0%');
        },
        xhr: function() {
            var xhr = new window.XMLHttpRequest();

            // Upload progress
            xhr.upload.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = (evt.loaded / evt.total) * 100;
                    $(".progress-bar").width(percentComplete+'%');
                }
            }, false);

            // Download progress
            xhr.addEventListener("progress", function(evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total * 100;
                    $find(".progress-bar").width(percentComplete+'%');
                }
            }, false);
            return xhr;
        },
        success: function(data) {
            alert("Success");
            // File Uploaded
        },
        error: function(xhr, textStatus, errorThrown) {
            alert("Error");
        },
    });
});

PATH_TO_UPLOADER是接收文件的url。

【讨论】:

  • 我已经编写了所有代码,除了上面解释的情况外,它都可以工作。我要解决的唯一问题是如何通过 Ajax 回调函数以编程方式打开上传对话框。
  • 澄清一下。我问的问题与打开文件上传对话框有关,而不是与上传本身有关。我需要根据 Ajax 回调函数的结果以编程方式打开文件上传对话框。这个 Ajax 回调函数不是上传本身的回调,而是一个回调返回一个值,该值确定服务器是否允许在用户尝试打开上传对话框后立即打开它。如果允许,我需要打开对话框,否则我会发布一条消息,为什么不允许。
  • 如果我理解你的问题,你需要使用 2 个 ajax。一是检查文件是否允许上传,二是在您的服务器上上传文件。 success: function(data) { // SECONT_AJAX } 而且我认为,如果允许像这样上传文件,这是一个不好的解决方案。在启动 AJAX 之前在 js 中做一个小测试(比如检查文件扩展名)。
  • 如果你想读取文件,你可以使用FileReader
  • 我需要在服务器上进行检查的原因是因为我需要根据驻留在数据库中的合同协议检查是否允许文件上传。允许合约上传覆盖的条件与文件本身无关,因此无法在客户端完成。它与可能不再允许更改文档的合同状态有关,因此无法上传新合同。此状态经常更改,并且在渲染时可能不正确或未知,必须在开始上传之前检查。
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 2011-08-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多