【问题标题】:Ajax File upload - not working in IEAjax 文件上传 - 在 IE 中不起作用
【发布时间】:2015-11-23 21:21:43
【问题描述】:

我的网站上有一个 ajax 图片上传,但在 IE 中无法使用。我注意到的第一个问题是 IE 中未定义“FormData”类型。我遇到了我在下面的 ajax 调用中使用的解决方法。但是,ajax 调用仅在单击上传时返回错误函数,从不点击我的控制器操作“UpdateAvatar”。在所有其他浏览器中都能完美运行。有人有这方面的经验吗?

<div class="modal-body">
    <input type="file" name="UploadFile" id="uploadfile">
</div>

<div class="modal-footer">
    <button type="button" class="btn btn-primary" data-dismiss="modal">Cancel</button>
    <button type="button" id="updateAvatarBtn" class="btn-success btn">Upload</button>
</div>

$('#updateAvatarBtn').click(function (event) {
    var file = $('#uploadfile').get(0).files;

    if (typeof FormData == "undefined") {
        var data = [];
        data.push('data', JSON.stringify(file));
    }
    else {
        var data = new FormData();
        data.append("file", file[0]);
    }
    $.ajax({
        url: 'AccountSetup/updateAvatar',
        type: 'POST',
        contentType: false,
        processData: false,
        data: data,
        success: function (response) {
            $('#imgPreview').attr("src", response);
            $('#uploadImageModal').modal('hide');
            toastr.success('Image Upload Successful');
        },
        error: function () {
            toastr.error('Image Upload Unsuccessful. Please try again.');
        }
    })
})    

【问题讨论】:

  • 您是否启动了开发者工具,查看是否在控制台窗口中添加了错误?

标签: jquery ajax file-upload


【解决方案1】:

我注意到的第一个问题是 IE 中未定义“FormData”类型。

这是主要问题。您无法在IE <= 9 中使用 AJAX 上传文件。对于那些旧版本的 IE,您将需要使用更古老的技术,例如使用 jquery.form 插件。此插件检测浏览器类型和版本,如果它发现旧版浏览器,它将回退到隐藏的 iframe 或 flash,因为这是您可以在这些旧版浏览器中模拟 AJAX 文件上传的唯一方法。

这是我个人所说的,我不会打扰那些过时的浏览器。我宁愿执行功能检测,如果浏览器不支持本机 HTML5 FormData,我会简单地通知用户,由于他使用这种旧版浏览器,他的体验会下降,并且只需使用完整回发到服务器。

【讨论】:

  • 你说得对,它在 IE 9 之后的版本中工作。我以为它是一般的 IE。
  • 其实 >= IE10 可以正常工作,因为它支持FormData。所以这个问题与 IE 无关,它与使用它的旧版本有关,它根本不支持这个特定的功能(等等)。如果您使用旧版本的 FireFox 或 Google Chrome,您也会遇到同样的问题。问题是这些浏览器使最终用户更难使用旧版本。
  • 您能否提供一个示例,说明我如何确定浏览器是否不支持 FormData 并在这种情况下恢复为正常的文件上传?
  • 当然,你的代码中已经有了这个:if (typeof FormData == "undefined")。您需要做的唯一更改是使用普通的submit 按钮而不是普通按钮,这样您就可以在浏览器不支持 FormData 的情况下执行标准表单提交操作。如果浏览器支持 FormData,那么您只需从您订阅的表单的提交处理程序返回 false 并执行您已有的 AJAX 调用。
  • 所以基本上你可以首先考虑如何使你的代码以正常方式工作()认为禁用javascript)然后你将为支持FormData的浏览器进行必要的不显眼的增强。这意味着您需要从一个标准的&lt;form&gt; 标记、一个&lt;input type='file"&gt; 和一个&lt;input type="submit"&gt; 按钮开始——这是基础知识,这绝对适用于您可能想象的任何用户代理。然后,您可以开始使用 javascript 订阅表单的 submit 处理程序并悄悄地对其进行增强。
猜你喜欢
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2011-09-14
  • 2015-12-04
  • 1970-01-01
  • 2012-06-29
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多