首页 > 其他分享 >文件上传取消请求

文件上传取消请求

时间:2022-11-20 22:15:14浏览次数:49  
标签:console 请求 取消 source progressEvent var 上传 CancelToken

通过请求配置参数里面的 cancelToken 可取消请求,通过CancelToken.source工厂方法创建一个 cancel token。

需求:在文件上传的基础上,加入取消请求和继续上传功能。

一、改造上传功能:

1、在上传功能中的 sendAjax 方法中创建 CancelToken,并调用其 source() 方法。

var CancelToken = this.$axios.CancelToken;
var source = CancelToken.source();
this.source = source;

2、在请求体上添加取消标识。

// 携带取消标识
cancelToken:source.token,

3、记录当前文件上传的进度,继续上传功能要使用。

// 记录当前加载的进度
this.currentLoaded = progressEvent.loaded;

 

二、取消功能:

1、添加取消请求按钮,并绑定点击事件 cancel 。

<button @click='cancel'>取消请求</button>

2、在取消事件里面通过 source 调用 cancel() 方法取消请求。

this.source.cancel('请求被取消');

三、继续上传功能:继续上传功能和上传功能一样,只是将文件进行分割,上传剩下的文件。

1、获取文件未上传的部分。调用 slice 方法,将当前文件进行分割。

// 文件分割  剩下文件的大小
var fileData = this.file.slice(this.currentLoaded, this.file.size);

2、将文件未上传的部分添加到 FormData 对象中。注意,文件名必须保持一致。

var fd = new FormData();
fd.append('file',fileData);

3、在上传进度条 onUploadProgress 中重新计算进度值。

// 总进度=已经上传的进度+正在上传的进度
this.currentLoaded += progressEvent.loaded;
// 计算进度
var progress = (this.currentLoaded/progressEvent.total)*100;

 

 案例完整代码如下:

    <script type="text/javascript">
        var App = {
            template:` 
                <div>
                    选择文件:{{rate}}%
                    上传进度:
                    <input type="file" name='file' @change='changeHandler' />
                    <button @click='sendAjax'>发送请求</button>
                    <button @click='cancel'>取消请求</button>
                    <button @click='resume'>继续上传</button>
                </div>
            `,
            data(){
                return{
                    file:{},
                    rate:0,
                    source:null,
                    currentLoaded:0
                }
            },
            methods:{
                cancel(){
                    this.source.cancel('请求被取消');
                },
                resume(){
                    var CancelToken = this.$axios.CancelToken;
                    var source = CancelToken.source();
                    this.source = source;
                    // 文件分割  剩下文件的大小
                    var fileData = this.file.slice(this.currentLoaded, this.file.size);
                    console.log(fileData);
                    var fd = new FormData();
                    fd.append('file',fileData);
                    this.$axios.post('upload',fd,{
                        // 携带取消标识
                        cancelToken:source.token,
                        // 上传进度条
                        onUploadProgress:(progressEvent)=>{
                            // 对原生进度事件处理
                            console.log(progressEvent);
                            // 总进度=已经上传的进度+正在上传的进度
                            this.currentLoaded += progressEvent.loaded;
                            // 计算进度
                            var progress = (this.currentLoaded/progressEvent.total)*100;
                            console.log(progress);

                            this.$nextTick(function(){
                                this.rate = Math.ceil(progress);
                            }) 
                        },
                    })
                    .then(res=>{
                        console.log(res);
                    })
                    .catch(err=>{
                        console.log(err);
                    })
                },
                sendAjax(){
                    this.$axios.defaults.baseURL = 'http://127.0.0.1:8888/';
                    var CancelToken = this.$axios.CancelToken;
                    var source = CancelToken.source();
                    this.source = source;
                    var fd = new FormData();
                    fd.append('file',this.file);
                    this.$axios.post('upload',fd,{
                        // 携带取消标识
                        cancelToken:source.token,
                        // 上传进度条
                        onUploadProgress:(progressEvent)=>{
                            // 对原生进度事件处理
                            console.log(progressEvent);
                            // 记录当前加载的进度
                            this.currentLoaded = progressEvent.loaded;
                            var progress = (progressEvent.loaded/progressEvent.total)*100;
                            console.log(progress);
                            this.$nextTick(function(){
                                this.rate = Math.ceil(progress);
                            }) 
                        },
                    })
                    .then(res=>{
                        console.log(res);
                    })
                    .catch(err=>{
                        console.log(err);
                    })
                },
                changeHandler(e){
                    console.log(e.target.files[0]);
                    this.file = e.target.files[0];
                }
            }
        }
        // 将axios挂载到Vue对象上
        Vue.prototype.$axios = axios

        new Vue({
            el:'#app',
            template:` 
                <App/>
            `,
            components:{
                App
            }
        });
    </script>

 

标签:console,请求,取消,source,progressEvent,var,上传,CancelToken
From: https://www.cnblogs.com/sfwu/p/16909731.html

相关文章

  • SpringMVC - 获取请求参数,作用域
    一、获取请求参数1.原生serveltAPI@ControllerpublicclassTestController{@RequestMapping("/test01")publicStringtest01(HttpServletRequestrequest){......
  • 需要授权的 API ,必须在请求头中使用 Authorization 字段提供 token 令牌
    原文链接:https://blog.csdn.net/wanghuohuo1998/article/details/118087204需要授权的 API ,必须在请求头中使用添加字段需要授权的API,必须在请求头中使用 Authoriz......
  • 文件上传
    一、上传文件。1、定义一个类型为file的input标签。2、在input标签中添加名为changeHandler的@change事件。3、在changeHandler方法内用this.file对象接......
  • 页面卸载前(用户关闭页面)向服务器发送请求
    废话不说,直接进正题。最近项目有个需求需要在用户关闭页面时将页面存留的统计数据发送到后端。该需求有两个关键点:监听页面卸载在卸载时发送数据如何监听用户关闭页......
  • Http2Bean——基于OkHttp与Gson的网络请求工具
    publicclassHttp2Bean<T>{privatefinalOkHttpClientclient=newOkHttpClient();privatefinalClass<T>clazz;privatefinalRequest.Builderreq......
  • ASP.NET Core教程-Pipeline(请求管道)
    更新记录转载请注明出处:2022年11月20日发布。2022年11月16日从笔记迁移到博客。请求管道是什么类似于水的管道,有流进流出。在ASP.NETCore中Server进行监听用户的......
  • 关于GET/POST请求传输时URL编码的介绍记录随笔
    UTF-8编码的汉字:少数是汉字每个占用3个字节,多数占用4个字节#GET请求编码Chrome会先把URL中非ASCII字符按照某种编码格式(谷歌浏览器是UTF-8)编码成byte数组后,然后转成16进......
  • 上传代码
    1<?php23//获取用户在搜索框输入的信息4$seek=$api->post('seek');5$b=$api->post('b');6$nowtime=$api->post('nowtime');7$c=b+10;8if($seek===......
  • 第4章SpringMVC核心技术-请求转发和重定向
    第4章SpringMVC核心技术-请求转发和重定向1请求重定向和转发概念当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据所要跳转......
  • 安卓系统中如何使用网络请求库
    目录在清单文件中,赋予app网络权限在module的gradle文件添加依赖在清单文件中,赋予app网络权限在包名下面加上这段内容<uses-permissionandroid:name="android.permissio......