前端如何上传文件

前端无法直接操作本地文件,所以需要用户触发。常见的有三种触发方式:

  • 通过<input type="file" id="file-input"/> 选择文件

  • 通过拖拽的方式把文件拖过来

  • 在编辑框里面复制粘贴

设置文件上传的样式

因为<input type="file" id="file-input"/> 文件不好修改样式,一般我们会自己做一个上传的按钮来代替原生上传按钮。

然后,可以在自定义按钮上绑定点击事件,在这个点击事件里面对原生上传按钮进行操作,可以像下面这样:

let file = document.querySelector('#fileInput');
file.click();

也可以将原生按钮覆盖在自定义按钮上面,然后将原生按钮和自定义按钮设置相同的大小,然后将原生按钮定位在自定义按钮之上,最后设置原生按钮的opacity为0即可。

点击按钮获取文件

第一种普通上传方式

$("#file-input").on("change", function() {
    console.log(`文件名称:${e.target.value}`); // C:\fakepath\1111.jpg
    
    // 创建一个formData对象,后期通过ajax上传到服务器
    let formData = new FormData();
    formData.append("iFile", this.files[0]);
    
    // ajax上传到服务器代码略...
});


// 后面再次获取到这个formData文件,就可以得到formData对象的myFileName文件(C:\fakepath\1111.jpg)
let file = formData.get('iFile');


// file类型数据件内容:
// {
//  lastModified: 1594620655781
//  lastModifiedDate: Mon Jul 13 2020 14:10:55 GMT+0800 (中国标准时间) {}
//  name: "1111.jpg"
//  size: 29848
//  type: "image/jpeg"
//  webkitRelativePath: ""
// }

这个file文件,如果是图片的话,需要在前端显示。但是file文件是二进制文件,没法直接查看,需要进一步转换。这个可以通过FileReader对象就可以做到。

通过实例化一个FileReader,调它的readAsDataURL并把File对象传给它,监听它的onload事件,load完读取的结果就在它的result属性里了。)它是一个base64格式的,可直接赋值给一个img的src)。

// 后期取到file文件
let reader = new FileReader();
let fileType = file.type;


// reader读取完成
reader.onload = function (e) {
    if(/^image\/[jpeg|png|gif]/.test(fileType)) {
        let img = document.createElement("img");
        img.src = e.target.result;
        document.body.appendChild(img); // 将图片插入body中
    }
}


// 调用reader进行读取
reader.readAsDataURL(file);

第二种拖拽的方式

我们需要监听拖拽事件:

$(".img-container").on("dragover", function (event) {
    event.preventDefault();
}).on("drop", function(event) {
    event.preventDefault();
    // 数据在event的dataTransfer对象里
    let file = event.originalEvent.dataTransfer.files[0];


    // 然后就可以使用FileReader进行操作
    fileReader.readAsDataURL(file);


    // 或者是添加到一个FormData
    let formData = new FormData();
    formData.append("fileContent", file);
})

第三种粘贴的方式

// 粘贴的数据是在event.clipboardData.files里面:
$("#editor").on("paste", function(event) {
    let file = event.originalEvent.clipboardData.files[0];
});

注意:上面,我们使用了三种方式获取文件内容,最后得到:

  • FormData格式

  • FileReader读取得到的base64二进制格式

如果不使用jQuery,没有问题,直接使用ajax发送就好;如果使用jQuery,要设置两个属性为false,因为jQuery会自动把内容做一些转义,并且根据data自动设置请求mime类型,这里告诉jQuery直接用xhr.send发出去就行了。:

$.ajax({
    url: "/upload",
    type: "POST",
    data: formData,
    processData: false,  // 不处理数据
    contentType: false   // 不设置内容类型
});

参考链接

  • https://juejin.im/post/5a193b4bf265da43052e528a

  • https://github.com/Daotin/notes/issues/70

前端上传文件button是一个用于页面中上传文件的按钮元素。用户可以通过点击这个按钮来选择所要上传文件,然后将文件发送到服务器进行处理或存储。 前端通常使用HTML中的<input>标签来创建一个上传文件的按钮。这个标签的type属性需要设置为"file",表示这是一个文件上传按钮。用户点击这个按钮后,会弹出一个文件选择对话框供用户选择文件。选择完成后,文件的路径会显示在按钮旁边的文本框中。 在用户选择完成文件后,前端通过JavaScript来处理用户选择的文件。通常可以使用File API来获取文件对象的信息,如文件名、文件类型、大小等。通过这些信息,可以对文件进行验证,比如判断文件类型是否符合要求、文件大小是否超过限制等。 在上传文件之前,还需要考虑将文件发送到服务器的方式。可以使用表单提交的方式,将文件包含在表单中一起提交给服务器。或者可以通过AJAX技术,使用XMLHttpRequest对象将文件以二进制数据的形式发送到服务器。 上传文件的过程还需要考虑上传进度的显示和错误处理。可以使用XMLHttpRequest对象的progress事件来监听上传进度,并通过JavaScript来更新进度条的状态。对于上传过程中出现的错误,可以在前端进行相应的处理,如显示错误信息或重新尝试上传等。 总之,前端上传文件button是一个用于选择并上传文件的按钮元素,它需要结合HTML、JavaScript和服务器端的处理来完成文件上传功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值