Uniapp上传下载文件-不限制文件类型-附详细代码解析

Uniapp上传下载文件,不限制文件类型

  • 1 知识小课堂
    • 1.1 Uniapp简介
    • 1.2 文件上传
    • 1.3 文件下载
  • 2 Uniapp上传文件
  • 3 Uniapp 下载文件

1 知识小课堂

1.1 Uniapp简介

在这里插入图片描述

UniApp是一款跨平台应用程序开发框架,它允许开发者使用同一套代码来构建基于多个操作系统的应用程序,包括iOS、Android、H5以及小程序等。

UniApp基于Vue.js框架,在统一的API和组件规范下,提供了类似原生应用的开发体验。这意味着开发者只需编写一套代码,就可以将应用程序发布到多个平台,从而大大减少了开发和维护的工作量。

1.2 文件上传

在uni-app中,常用的文件上传工具有uni-file-picker和uni.uploadFile()。

uni-file-picker是uni-app封装上传图片和文件的组件,它支持从本地选择文件或使用相机拍摄。使用uni-file-picker,你可以选择任意类型的文件进行上传,包括图片、视频、文档等。

另外,uni.uploadFile()是uni-app为了弥补原生uni.request缺陷,可以直接写文挡服务器地址。它主要用于上传文件,也支持同时上传多个文件。你可以通过设置上传文件的参数,包括文件类型、文件大小、文件名等,来控制上传的行为。

1.3 文件下载

在uni-app中,文件下载是一个常见的需求。为了满足这个需求,开发者们常常使用uni.downloadFile()这个方法。这个方法非常实用,它可以从指定的URL下载文件,并在下载完成后,返回文件的本地路径。这对于需要下载文件并在应用中使用的场景非常有用。

下面是一个使用uni.downloadFile()方法的示例:

uni.downloadFile({url: 'https://example.com/file.txt', // 文件的URLsuccess: function (res) {console.log('下载成功', res);// 在这里可以处理文件下载后的操作,比如保存到本地、读取文件内容等},fail: function (err) {console.log('下载失败', err);// 在这里可以处理文件下载失败的情况,比如重新下载、提示用户等}
});

在上述代码中,我们首先定义了文件的URL,然后调用了uni.downloadFile()方法来下载文件。在成功回调函数中,我们可以处理文件下载后的操作,比如保存到本地、读取文件内容等。在失败回调函数中,我们可以处理文件下载失败的情况,比如重新下载、提示用户等。

需要注意的是,uni.downloadFile()方法默认会将文件保存在应用的临时目录下。如果需要将文件保存到应用的本地目录下,可以在下载文件的URL后面添加一个自定义的路径。例如:

uni.downloadFile({url: 'https://example.com/file.txt?path=/my/custom/path/', // 文件的URL,包含自定义路径success: function (res) {console.log('下载成功', res);// 在这里可以处理文件下载后的操作,比如保存到本地、读取文件内容等},fail: function (err) {console.log('下载失败', err);// 在这里可以处理文件下载失败的情况,比如重新下载、提示用户等}
});

在上述代码中,我们在文件的URL后面添加了一个自定义的路径/my/custom/path/。这样,文件就会被保存在应用的/my/custom/path/目录下。

2 Uniapp上传文件

模板部分

<view class="example-body"><uni-file-picker v-model="fileLists" :list-styles="listStyles"  file-mediatype="all"  @select="fj_select"  mode="list" @delete="fj_delete" @progress="fj_progress" @success="fj_success" @fail="fj_fail"></uni-file-picker>
</view>
//上传附件fj_select(fj_select_data){let that = this;// console.log("dizhi ",fj_select_data.tempFiles[0].file.name)let upload_name = fj_select_data.tempFiles[0].file.name;// console.log("选择附件-----",fj_select_data);this.upload_qtwj(fj_select_data,upload_name);		// this.upload_name()},
//2.其他文书上传upload_qtwj(file_path,upload_name){let that = this;// console.log("准备上传:",file_path);// console.log("获取的名字",upload_name)const tempFilePaths = file_path.tempFilePaths;uni.uploadFile({url: sys_config.ruoyi_root+'common/uploadName',header: {'Authorization': 'Bearer '+uni.getStorageSync('token') //请求头信息},filePath:tempFilePaths[0],name: 'file',// formData:{'name':'c测试'},formData:{'name':upload_name},success: (uploadFileRes) => {let json_data= JSON.parse(uploadFileRes.data)console.log("上传完成:",json_data);that.book_qtwj_arr_edit.push({'url':sys_config.ruoyi_root+json_data.fileName})that.book_selectwj_arr.push(json_data.fileName)that.book_form.qtwj = that.book_selectwj_arr.toString();// console.log('当前文件全路径:',that.book_qtwj_arr_edit)console.log('当前文件相对路径:',that.book_selectwj_arr)// console.log('上传的附件:',that.book_form.qtwj)	}});},

3 Uniapp 下载文件

完整的下载过程

<template><view class="main"><view class="img_box" style="width:100%; height: 80%;">			<image style="width:90%; height: 100%; background-color: #FFFFFF;" :mode="aspectFit" :src="img_src" @error="imageError" ></image><!-- <web-view :webview-styles="webviewStyles" :src="qtwj_src" @error="filesError" @message="getmessage"  @onPostMessage="handlePostMessage" @load="webViewLoad" ></web-view> --></view><uni-popup ref="alertDialog" type="dialog"><uni-popup-dialog :type="msgType" cancelText="取消" confirmText="保存" title="保存附件" content="将附件保存至手机" @confirm="onSaveFilesClick(qtwj_src)" @close="dialogClose"></uni-popup-dialog></uni-popup><view class="btn_box"><button class="big_btn" @click="dialogToggle('info')" type="primary"><uni-icons type="download" size="18" color="#FFFFFF"></uni-icons> 下载</button><button class="big_btn" @click="goto_previous()"><uni-icons type="back" size="18" color="#333"></uni-icons> 返回</button></view></view>
</template><script>
import sys_config from '../../common/sys_config.js';	
export default {data() {return {img_src:"/static/custom/book/附件文档.png",qtwj_src:"",filesError:"Error",webviewStyles:{progress: {color: '#FF3333',},}}},onLoad: function (options) {console.log('其他附件预览:',options);this.qtwj_src = options.qtwj_view;		},methods: {goto_previous(){wx.navigateBack({delta: 1});},dialogToggle(type) {this.msgType = typethis.$refs.alertDialog.open()},	dialogClose() {wx.showToast({title: '取消保存',duration: 2000,mask: true,icon: "error",});},webViewLoad(){wx.showToast({title: '加载成功',duration: 2000,mask: true,icon: "success",});},webViewEerror(data){wx.showToast({title: '加载失败',duration: 2000,mask: true,icon: "error",});},getmessage(e){console.log("页面接受的信息",e)},goToEdge(){uni.navigateTo({ url: 'plugin://NativePlugin/webview?url=http://www.uniapp.com' })},// webview向外部发送消息handlePostMessage: function(data) {console.log("接收到消息:" + JSON.stringify(data.detail));},// 点击下载按钮实现文件的下载:onSaveFilesClick(file){let acceptArr = ["JPG", "PNG", "JPEG"];let videoFiles = "MP4";let rarfiles = "RAR";const fileSuffix = file.substring(file.lastIndexOf(".") + 1).toUpperCase();		//加载框动画uni.showLoading({ title: '正在下载……' });	uni.downloadFile({ //只能是GET请求url: file, //请求地址(后台返回的码流地址)success: (res) => {// console.log("请求地址(后台返回的码流地址res",res);//下载成功if (res.statusCode === 200) {uni.hideLoading();   //隐藏加载框//保存文件var tempFile = res.tempFilePath;// console.log(tempFile, res, 'tempFilePath');if (acceptArr.indexOf(fileSuffix) >= 0) {this.onSaveImageClick();} else if(videoFiles.indexOf(fileSuffix) >= 0){// console.log("视频")this.onSaveVideoClick();}else if(rarfiles.indexOf(fileSuffix) >= 0){// console.log("rar")this.onSaveRarClick(file);}else {console.log('文件');//保存成功之后 打开文件uni.openDocument({filePath: tempFile,showMenu: true, //微信小程序 downloadFile生成的tempFilePath为临时路径无法直接保存到手机 显示菜单设置可以手动保存到手机本地fail: (e) => {console.log(e, '打开失败');let nowEno = uni.getSystemInfoSync().platform; //当前环境console.log(e, '打开失败', nowEno)if (nowEno == 'ios') { //ios打开临时路径文件失败 设置ios环境下读取临时路径文件可以打开uni.getFileSystemManager().readFile({filePath: tempFile,success: res => {console.log("filebuffer",res);var filebuffer = res.data;return filebuffer;},fail: console.error,})} else {uni.showToast({title: '打开失败',icon: "error",})}			}})			}}},fail: (e) => {console.log(e, '文件下载失败')uni.showToast({title: '文件下载失败',icon: "error",})}});	},// 保存视频://下载onSaveImageClickonSaveVideoClick() {//视频保存到相册跟图片保存到相册使用方式相同//下载到本地,判断是否拥有权限wx.getSetting({withSubscriptions: true,success: res => {console.info("res.authSetting",res.authSetting);if (res.authSetting['scope.writePhotosAlbum']) {wx.downloadFile({url: this.qtwj_src,success: res => {//保存到相册wx.saveVideoToPhotosAlbum({filePath: res.tempFilePath,success: res => {console.info("视频保存到相册",res);	                                wx.showToast({title: '视频保存到相册',icon:'success'										})},fail: res => {wx.showToast({title: '保存失败',icon:'error'										})}})}});} else {wx.showModal({cancelColor: 'cancelColor',title: '提示',content: '请开启相册访问权限',success: res => {									if (res.confirm){wx.openSetting({withSubscriptions: true,})}									}})}}})},// 保存rar压缩包等onSaveRarClick(tempfilePath){console.log("rar来了",tempfilePath);let rootPath = wx.env.USER_DATA_PATH;let cachePath = rootPath+"/cache";console.log("rootPath",rootPath);console.log("cachePath",cachePath)const fs = wx.getFileSystemManager();fs.readZipEntry({filePath: this.qtwj_src,entries: 'all',encoding: 'utf-8', // 统一指定读取文件的字符编码,如果不传 encoding,则以 ArrayBuffer 格式读取文件的二进制内容success(res) {console.log("保存成功",res);console.log("存rar压缩包",res);// res.entries === {//     'some_folder/my_file.txt': {//         errMsg: 'readZipEntry:ok',//         data: 'xxxxxx'//     },//     'other_folder/orther_file.txt': {//         errMsg: 'readZipEntry:ok',//         data: 'xxxxxx'//     }//  }},fail(res) {console.log("保存失败",res);// this.cunQu();},});},// 保存图片onSaveImageClick() {let that = this;wx.getSetting({success(res) {// 如果已授权console.log("获取授权",res)if (res.authSetting['scope.writePhotosAlbum']) {that.bindseaveimage();// 如果没有授权 } else if (res.authSetting['scope.writePhotosAlbum'] === undefined) {// 调起用户授权wx.authorize({scope: 'scope.writePhotosAlbum',success() {that.bindseaveimage();},fail() {wx.showToast({title: '您没有授权,无法保存到相册',icon:'error'})}})// 如果之前授权已拒绝} else {wx.openSetting({success(res) {if (res.authSetting['scope.writePhotosAlbum']) {that.bindseaveimage();} else {wx.showToast({title: '您没有授权,无法保存到相册',icon:'error'									})}}})}}});},// 图片具体保存方法bindseaveimage:function(){wx.getImageInfo({src: this.qtwj_src,success: function (ret) {var path = ret.path;wx.saveImageToPhotosAlbum({filePath: path,success(result) {// console.log("成功");wx.hideLoading();wx.showToast({title: '保存成功',duration: 2000,mask: true,							});},fail(result) {wx.showToast({title: '失败,你取消了操作',duration: 2000,icon: 'error',});// console.log("失败,你取消了",JSON.stringify(result))// console.log(path);wx.openSetting({success: (res) => {// console.log(res);}})}});}});}},//初始化mounted () {}
}
</script><style scoped>
.main {flex-direction: column;align-items: center;justify-content: center;height:1000rpx;}
.img_box{width:90%;height:90%;padding:5%}.btn_box{width: 100%;padding-bottom: 30rpx;position: fixed;background-color: #FFFFFF;bottom: 0;box-shadow: 0 5px 5px 4px rgba(0, 0, 0, .5);}
.btn_box .big_btn{margin-top:20rpx;width:80%}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284045.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Mac系统下为SpringBoot 配置Maven 【避坑完整版】

前提背景 电脑罢工&#xff0c;操作系统重装&#xff0c;不仅有大量的软件需要安装&#xff0c;还有很多开发环境需要配置。 就在今天配置Maven的时候各种坑&#xff0c;写下来供大家参考。 一、在讨论安装Maven前先安装一下JDK,方式很多&#xff0c;我这里有个比较快的办法&am…

Postman介绍和快速使用

Postman 是什么&#xff1f; Postman 是一个流行的API&#xff08;Application Programming Interface&#xff09;开发工具&#xff0c;它使得开发者可以很容易地创建、测试、共享和文档化API。Postman 提供了一个友好的用户界面&#xff0c;来发送HTTP请求&#xff0c;接收响…

prince2和Pmp哪个含金量高?

先来说下 prince 2 和 pmp 的区别 一、prince 2 是什么&#xff1f;跟PMP有什么区别&#xff1f; prince2 是 PRojetcts IN Controllde Environments 的简称&#xff0c;中文意思是受控环境下的项目&#xff0c;指的就是受控环境下的项目管理方法论。 如果知道 PMP 的可以简…

健康卤味思想引领市场新潮流,卤味市场迎来健康变革

健康卤味思想正在逐渐渗透到卤味市场中&#xff0c;引领着消费者对于卤味产品的选择和需求。这一变革不仅为消费者带来了更加健康、美味的卤味产品&#xff0c;也为卤味市场注入了新的活力。 一、健康卤味思想的兴起 随着消费者对于健康饮食的关注度不断提高&#xff0c;健康卤…

带你了解OpenCV4工业缺陷检测的六种方法

文章目录 OpenCV4工业缺陷检测的六种方法机器视觉缺陷检测1. 工业上常见缺陷检测方法方法一&#xff1a;基于简单二值图像分析实现划痕提取&#xff0c;效果如下&#xff1a;方法二&#xff1a;复杂背景下的图像缺陷分析&#xff0c;基于频域增强的方法实现缺陷检测&#xff0c…

ipfire

安装 网卡地址配置 非常重要&#xff0c;配置不正确&#xff0c;影响ipfire正常工作 setup可以进入设置界面 配置 创建端口转发规则 设置端口转发是一项非常常见的任务。本指南解释了如何快速设置端口转发规则。请查看防火墙规则参考以了解更多说明。 技术背景 端口转发…

GPT-4.5!!!

GPT-4 还没用明白&#xff0c;GPT-4.5 就要发布了。 最近&#xff0c;OpenAI 泄露了 GPT-4.5 的发布页面&#xff0c;除了进一步增强复杂推理和跨模态理解&#xff0c;GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持&#xff0c;也就意味着多模态最后一块版图…

webview 的 title 和 url

在Appium以混合型App进行自动化操作时&#xff0c;遇到WebView时切换至WebView才能进行操作。当遇到多个WebView时&#xff0c;可以利用 title 和 url 切换至相应的 WebView。

测试用例设计方法六脉神剑——第五剑:化气为型,场景用例破云 | 京东物流技术团队

1 引言 前几篇文章主要针对单点功能的测试用例设计方法展开介绍。然而&#xff0c;当拿到一个测试任务时&#xff0c;并非先关注某个功能的细节测试&#xff0c;而是先要使用场景法对主要业务流程和主要功能展开测试&#xff0c;当业务场景没有问题后&#xff0c;再使用等价类…

k8s集群内部署nacos集群

一、前言 在k8s集群中部署nacos集群需要用到以下服务setafulset、pv、pvc、service、configmap&#xff0c;setafulset用来管理nacos服务&#xff0c;因为nacos服务是有状态服务&#xff0c;所以需要使用setafulset&#xff0c;pv、pvc用来挂载存储nacos数据的路径&#xff0c;…

数据结构:图文详解 队列 | 循环队列 的各种操作(出队,入队,获取队列元素,判断队列状态)

目录 队列的概念 队列的数据结构 队列的实现 入队 出队 获取队头元素 获取队列长度 循环队列的概念 循环队列的数据结构 循环队列的实现 判断队列是否为空 判断队列是否已满 入队 出队 得到队头元素 得到队尾元素 队列的概念 队列&#xff08;Queue&#xff0…

音频世家索尼:醇音典范 一脉相承! 参展第九届中国(广州)国际耳机展,懂音乐懂生活更懂你

第九届中国&#xff08;广州&#xff09;国际耳机展于2023年12月16日至12月17日&#xff0c;在广州白云国际会议中心一楼举行。浸润于音频行业70余年的“音频世家——索尼&#xff0c;秉持“For The Music”&#xff08;为音乐而生&#xff09;的音频品牌理念&#xff0c;将惊喜…