首页 > 其他分享 >uniapp项目实践总结(十二)封装通用请求上传以及下载方法

uniapp项目实践总结(十二)封装通用请求上传以及下载方法

时间:2023-09-07 21:23:01浏览次数:41  
标签:uniapp 封装 url data let result 上传 options

导语:在日常开发过程中,前端经常要和后端进行接口联调,获取并且渲染数据到页面中,接下来就总结一下 uniapp 中获取请求、文件下载和上传的一些方法。

目录

  • 原理分析
  • 方法实现
  • 实战演练
  • 案例展示

原理分析

主要是使用uni.request方法来发送请求,uni.downloadFile方法来下载文件,uni.uploadFile方法来上传文件。

以下方法存于根目录下的scripts文件夹下的http.js文件中。

方法实现

接下来一一说明如何实现数据请求、文件下载以及文件的上传的方法封装。

数据请求

这个方法要接收一些参数,和现有默认参数合并,然后传给请求 API,获取数据后使用try...catch来处理成功和失败。

这里要引入一些文件,包括请求的域名和地址,以及一些通用方法,就先省略了,接口可以到网上找一下公共的,或者自己使用 node 搭建一个简易的接口服务器。

// 网络请求
async function request(options) {
  let isHttp = options.url.indexOf("http") > -1;
  let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`;
  let defultOptions = {
    url,
    method: options.method || "get",
    data: options.data || null,
    timeout: options.timeout || 30000,
    dataType: options.dataType || "json",
    header: options.header || {
      "Content-Type": "application/json",
    },
    sslVerify: options.sslVerify || false,
  };
  let params = { ...options, ...defultOptions };
  console.log("请求参数:", params);
  try {
    let result = await uni.request(params);
    if (result.statusCode === 200) {
      return result.data;
    } else {
      return {
        code: 102,
        msg: "get_fail",
        data: {
          info: result.errMsg,
        },
      };
    }
    return result;
  } catch (e) {
    return {
      code: 101,
      msg: "get_fail",
      data: {
        info: e,
      },
    };
  }
}

文件下载

这个就和请求一样,只不过 API 不一样,看一下内容。

// 下载文件
async function download(options) {
  let isHttp = options.url.indexOf("http") > -1;
  let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`;
  let defultOptions = {
    url,
    timeout: options.timeout || 30000,
    header: options.header || {},
    filePath: options.filePath,
  };
  let params = { ...options, ...defultOptions };
  console.log("下载参数:", params);
  try {
    let result = await uni.downloadFile(params);
    if (result.statusCode === 200) {
      return result.tempFilePath;
    } else {
      return {
        code: 102,
        msg: "download_fail",
        data: {
          info: result.errMsg,
        },
      };
    }
    return result;
  } catch (e) {
    return {
      code: 101,
      msg: "download_fail",
      data: {
        info: e,
      },
    };
  }
}

文件上传

文件上传同以上一样,简单封装一下。

// 上传文件
async function upload(options) {
  let isHttp = options.url.indexOf("http") > -1;
  let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`;
  let defultOptions = {
    url,
    timeout: options.timeout || 30000,
    filePath: options.filePath || "",
    name: options.name || "file",
  };
  let params = { ...options, ...defultOptions };
  console.log("上传参数:", params);
  try {
    let result = await uni.uploadFile(params);
    if (result.statusCode === 200) {
      return JSON.parse(result.data);
    } else {
      return {
        code: 102,
        msg: "upload_fail",
        data: {
          info: result.errMsg,
        },
      };
    }
    return result;
  } catch (e) {
    //TODO handle the exception
    return {
      code: 101,
      msg: "upload_fail",
      data: {
        info: e,
      },
    };
  }
}

写好以后记得导出方法。

实战演练

模板内容

  • 请求内容
<view class="list-http">
  <button @click="sendReq">发起请求</button>
  <text class="list-http-txt">响应内容:{{ httpInfo.request }}</text>
</view>
  • 下载内容
<!-- 下载图片 -->
<view class="list-http">
  <button @click="downloadImg">下载图片</button>
  <text class="list-http-txt">响应内容:</text>
  <image class="list-http-img" :src="httpInfo.imgUrl" mode="widthFix"></image>
</view>
<!-- 下载文件 -->
<view class="list-http">
  <button @click="downloadFile">下载文件</button>
  <text class="list-http-txt">响应内容:{{ httpInfo.fileUrl }}</text>
</view>
  • 上传内容
<!-- 上传图片 -->
<view class="list-http">
  <button @click="uploadImg">上传图片</button>
  <text class="list-http-txt">响应内容:</text>
  <image
    class="list-http-img"
    :src="httpInfo.uploadImgUrl"
    mode="widthFix"
  ></image>
</view>
<!-- 上传文件 -->
<!-- #ifdef H5 || MP-WEIXIN -->
<view class="list-http">
  <uni-file-picker
    ref="files"
    :auto-upload="false"
    limit="1"
    title="最多选择1个文件"
    file-mediatype="all"
    mode="list"
    @select="fileSelect"
    @progress="fileProgress"
    @success="fileSuccess"
    @fail="fileFail"
  ></uni-file-picker>
  <text class="list-http-txt">响应内容:{{ httpInfo.uploadFileUrl }}</text>
</view>
<!-- #endif -->

脚本方法

  • 定义数据
let httpInfo = reactive({
  request: null,
  imgUrl: "",
  fileUrl: "",
  uploadImgUrl: "",
  uploadFileUrl: "",
});
  • 请求方法
// 请求内容
async function sendReq() {
  let opts = {
    url: proxy.$apis.urls.food,
    method: "get",
  };
  let data = await proxy.$http.request(opts);
  if (data.code == 200) {
    httpInfo.request = JSON.stringify(data.data.list);
  }
  console.log("请求内容:", data);
}
  • 下载图片
// 下载图片
async function downloadImg() {
  let opts = {
    url: proxy.$apis.urls.img,
  };
  let data = await proxy.$http.download(opts);
  if (data) {
    httpInfo.imgUrl = data;
  }
}
  • 下载文件
// 下载文件
async function downloadFile() {
  let opts = {
    url: proxy.$apis.urls.txt,
  };
  let data = await proxy.$http.download(opts);
  console.log(data);
  if (data) {
    httpInfo.fileUrl = data;
  }
}
  • 上传图片
// 上传图片
async function uploadImg() {
  uni.chooseImage({
    complete(res) {
      if (res.tempFiles) {
        let file = res.tempFiles[0];
        uploadSet(file.path);
      }
    },
  });
}
  • 上传文件
// 上传文件

// 获取上传状态
function fileSelect(e) {
  console.log("选择文件:", e);
  if (e.tempFiles) {
    let file = e.tempFiles[0];
    uploadSet(file.path, "file");
  }
}

// 获取上传进度
function fileProgress(e) {
  console.log("上传进度:", e);
}

// 上传成功
function fileSuccess(e) {
  console.log("上传成功");
}

// 上传失败
function fileFail(e) {
  console.log("上传失败:", e);
}
  • 上传操作
// 上传操作
async function uploadSet(filePath, type = "img") {
  let opts = {
    url: proxy.$apis.urls.upload,
    filePath,
  };
  let data = await proxy.$http.upload(opts);
  if (data.code == 200) {
    httpInfo[type == "img" ? "uploadImgUrl" : "uploadFileUrl"] = data.data.url;
    httpInfo.fileName = data.data.filename;
  } else {
    uni.showToast({
      title: data.data.info,
      icon: "error",
    });
  }
}

案例展示

请求方法预览

在这里插入图片描述

文件下载预览

  • 下载图片
    在这里插入图片描述

  • 下载文件
    在这里插入图片描述

文件上传预览

  • 上传图片
    在这里插入图片描述

  • 上传文件
    在这里插入图片描述

最后

以上就是封装通用请求上传以及下载方法的主要内容,有不足之处,请多多指正。

标签:uniapp,封装,url,data,let,result,上传,options
From: https://www.cnblogs.com/guanqiweb/p/17686078.html

相关文章

  • Uniapp生命周期
    Uniapp页面&组件生命周期页面的生命周期uni-app支持如下生命周期函数:onLoad监听页面加载,其参数为上个页面传递的数据,参数类型为object(用于页面传参)onShow监听页面显示onReady监听页面初次渲染完成onHide监听页面隐藏onUnload监听页面卸载onPullDownRefresh监听用......
  • java 支持 超大上G,多附件上传插件
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1. 通过form表单向后端发送请求         <formid="postForm" action="${pageContext.request.contextPath}/UploadServlet" method="pos......
  • uniApp 再下一页修改上一页的值
    letpages=getCurrentPages();//获取所有页面栈实例列表 letnowPage=pages[pages.length-1];//当前页页面实例 letprevPage=pages[pages.length-2];//上一页页面实例 if(prevPage.$vm.info.SN!=undefined){ prevPage.$vm.info.SN=str; ......
  • java 泛型作为方法的返回值的封装
    问题背景业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。类似StringresStr=xxxHttpClient.post(),然后它返回一个字符串,你还需要反序列化成某种格式的。返回值可以反序列化成的形式如下:{ privateStringcode;privateStringmessage; //这......
  • uniapp 开发安卓/ios文件读写
    利用5+appnative.jsio文件管理模块1.新建js文件//文件写入exportconstwriteFileIos=function(filename,data){ plus.io.requestFileSystem( plus.io.PUBLIC_DOCUMENTS,//文件系统中的根目录 fs=>{ //创建或打开文件,fs.root是根目录操作对象,直接fs表示......
  • 用友U8 CRM客户关系管理系统 getemaildata.php 任意文件读取漏洞&任意文件上传漏洞
    漏洞简介用友U8CRM客户关系管理系统getemaildata.php存在任意文件读取漏洞,攻击者通过漏洞可以获取到服务器中的敏感文件。用友U8CRM客户关系管理系统getemaildata.php文件存在任意文件上传漏洞,攻击者通过漏洞可以获取到服务器权限,攻击服务器漏洞影响用友U8CRM客户关系......
  • 用友NC 6.5未授权文件上传漏洞
    漏洞描述用友NC6.5版本存在未授权文件上传漏洞,攻击者可以未授权上传任意文件,进而获取服务器控制权限。影响版本NC6.5漏洞复现fofa语法:app="用友-UFIDA-NC"访问页面POC脚本如下:importrequestsimportthreadpoolimporturllib3importsysimportargparseurllib3.di......
  • 视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)
    //视频上传过程中自动转换为flv格式并截图生成缩略图(Java调用命令实现)importjava.util.ArrayList;importjava.util.List;publicclassVideoProcess{System.out.println(oldfilepath+"->"+newfilename+"->"+newimg);List<String>commen......
  • 高亮LED数码管显示驱动IC-VK16K33/AA/B/BA/C 多种封装 质量稳定 适用于计量插座,数字闹
    概述VK16K33是一种带按键扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、键盘扫描、LED驱动模块等电路。数据通过I2C通讯接口与MCU通信。SEG脚接LED阳极,GRID脚接LED阴极,可支持16SEGx8GRID的点阵LED显示面板。最大支持13×3的按键。内置上电复位电路,整体闪烁频......
  • 用友畅捷通T+ Upload.aspx任意文件上传漏洞CNVD-2022-60632
    漏洞描述用友畅捷通T+Upload.aspx接口存在任意文件上传漏洞,攻击者通过preload参数绕过身份验证进行文件上传,控制服务器漏洞影响用友畅捷通T+漏洞复现fofa语法:app="畅捷通-TPlus"登录页面如下:上传文件类型验证不完善,可上传任意文件到服务器中的任意位置,验证POCPOST/......