编程 JavaScript 上传文件的几种方式

2024-11-18 21:11:59 +0800 CST views 831

在Web开发中,上传文件是常见的需求。本文介绍了三种使用JavaScript上传文件的方式。

方法1:使用Ajax,通过FormData传参

这种方式使用Ajax结合FormData对象来上传文件。需要注意的是,FormData对象只兼容IE10及以上的浏览器。

var formData = new FormData();
var file = $('.import-file-btn').get(0).files[0];

formData.append('file', file);
formData.append('id', id);
formData.append('name', name);

$.ajax({
    url: 'user/validate_import_data',
    type: 'POST',
    cache: false,
    data: formData,
    processData: false, // 不处理数据
    contentType: false, // 不设置内容类型
    dataType: "json",
    success: function (res) {
        // 成功回调
    },
    error: function (XmlHttpRequest, textStatus, errorThrown) {
        // 错误回调
    },
    complete: function () {
        // 完成回调
    }
});

优点

  • 支持异步请求,不刷新页面。
  • 方便附带其他参数。

缺点

  • 不兼容IE10以下的浏览器。

方法2:使用jquery.form.js

这种方式使用jquery.form.js插件进行文件上传,兼容性较好,推荐使用。

HTML

<form id="import-file-form" action="user/validate_import_data" method='post' enctype='multipart/form-data' target="form">
     <input type="file" name="file" class="import-file-btn" title="">
     <input type="hidden" name="id">
     <input type="hidden" name="name">
</form>

JavaScript

$('#import-file-form').ajaxSubmit({
    dataType: 'json',
    beforeSerialize: function () {
        // 此处可对参数进行处理
    },
    success: function (res) {
        // 成功回调
    },
    error: function (XmlHttpRequest, textStatus, errorThrown) {
        // 错误回调
    },
    complete: function () {
        // 完成回调
    }
});

优点

  • 兼容IE浏览器,适用范围广。
  • 操作简便,插件提供了丰富的配置选项。

缺点

  • 需要引入额外的插件。

方法3:使用Form表单上传,通过Iframe接收回调

这种方式利用<iframe>标签处理文件上传的回调。

HTML

<form id="import-file-form" action="user/validate_import_data" method='post' enctype='multipart/form-data' target="form"> <!-- 注意target不能缺少 -->
    <input type="file" name="file" class="import-file-btn">
    <input type="hidden" name="id">
    <input type="hidden" name="name">
    <button type="submit" id="submit-import-file" style="display:none">提交</button>
</form>
<iframe name="form" id="import-file-iframe" style="display:none"></iframe>

JavaScript

$("#submit-import-file").click();
$("#import-file-iframe").load(function(){
    var text = $(this).contents().find("body").text(); // 获取到的是json字符串
    var res = $.parseJSON(text); // json字符串转换成json对象
    console.log(res);
});

优点

  • 兼容性好,支持旧版本浏览器。

缺点

  • 无法处理非200状态码的请求,无法检测到请求错误。

这三种方法各有优缺点,可以根据具体需求选择合适的实现方式。如果需要兼容旧版浏览器且不需要异步处理,方法3是一个合适的选择;如果希望使用现代的异步请求并支持附带其他参数,方法1或方法2更为合适。

复制全文 生成海报 Web开发 文件上传 JavaScript

推荐文章

浅谈CSRF攻击
2024-11-18 09:45:14 +0800 CST
实用MySQL函数
2024-11-19 03:00:12 +0800 CST
介绍Vue3的Tree Shaking是什么?
2024-11-18 20:37:41 +0800 CST
Vue3中如何处理SEO优化?
2024-11-17 08:01:47 +0800 CST
Vue3中如何处理异步操作?
2024-11-19 04:06:07 +0800 CST
Go语言中实现RSA加密与解密
2024-11-18 01:49:30 +0800 CST
robots.txt 的写法及用法
2024-11-19 01:44:21 +0800 CST
在 Rust 生产项目中存储数据
2024-11-19 02:35:11 +0800 CST
php客服服务管理系统
2024-11-19 06:48:35 +0800 CST
Go 1.23 中的新包:unique
2024-11-18 12:32:57 +0800 CST
快手小程序商城系统
2024-11-25 13:39:46 +0800 CST
JavaScript中的常用浏览器API
2024-11-18 23:23:16 +0800 CST
前端项目中图片的使用规范
2024-11-19 09:30:04 +0800 CST
底部导航栏
2024-11-19 01:12:32 +0800 CST
Nginx 跨域处理配置
2024-11-18 16:51:51 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
在 Docker 中部署 Vue 开发环境
2024-11-18 15:04:41 +0800 CST
详解 Nginx 的 `sub_filter` 指令
2024-11-19 02:09:49 +0800 CST
deepcopy一个Go语言的深拷贝工具库
2024-11-18 18:17:40 +0800 CST
程序员茄子在线接单