uniapp下载&打开实现方案,支持安卓ios和h5,下载文件到指定目录,安卓文件管理内可查看到

uniapp下载&打开实现方案,支持安卓ios和h5

Android:

1、申请本地存储读写权限

2、创建文件夹(文件夹不存在即创建)

3、下载文件

ios:

1、下载文件

2、保存到本地,需要打开文件点击储存

使用方法:

js 复制代码
downloadFile(fileUrl, fileName)

file.js

js 复制代码
let downloadFilePath = '/storage/emulated/0/yulong-ys-files'
// 创建文件夹
export const createDir = () => {
  return new Promise((resolve, reject) => {
    // 申请本地存储读写权限
    plus.android.requestPermissions([
      'android.permission.WRITE_EXTERNAL_STORAGE',
      'android.permission.READ_EXTERNAL_STORAGE',
      'android.permission.INTERNET',
      'android.permission.ACCESS_WIFI_STATE'
    ], success => {
      const File = plus.android.importClass('java.io.File')
      let file = new File(downloadFilePath)
      // 文件夹不存在即创建
      if (!file.exists()) {
        file.mkdirs()
        resolve()
      }
      resolve()
    }, error => {
      Tips.toast('无法获取权限,文件下载将出错')
      reject(error)
    })
  })

}

// 下载文件操作
async function doDownloadFile(url, fileName, options, osName) {
  if (osName === 'Android') {
    await createDir()
  }
  Tips.loading('正在下载...')
  let dTask = plus.downloader.createDownload(url, options, async (d, status) => {
    Tips.hideLoading()
    if (status == 200) {
      plus.io.convertLocalFileSystemURL(d.filename)
      await Tips.confirm('文件已保存,是否打开?')
      uni.openDocument({
        filePath: d.filename,
        success: () => {
          console.log('成功打开')
        }
      })
    } else {
      console.log('下载失败')
      console.log(d)
      Tips.toast('下载失败')
      Tips.hideLoading()
      plus.downloader.clear()
    }
  })
  dTask.start()
}

// 下载文件
export function downloadFile(url, fileName) {
  if (!url) {
    Tips.toast('下载地址不能为空')
    return Promise.reject('下载地址不能为空')
  }
  // #ifdef H5
  window.location.href = url
  // #endif
  // #ifdef APP-PLUS
  let osName = plus.os.name;
  if (osName === 'Android') {
    doDownloadFile(url, fileName, {filename: 'file://' + downloadFilePath + '/' + fileName}, osName)
  } else {
    doDownloadFile(url, fileName, {}, osName)
  }
  // #endif
}

Tips.js

js 复制代码
/**
 * 提示与加载工具类
 */
export default class Tips {
  constructor() {
    this.isLoading = false;
  }
  /**
   * 弹出提示框
   */

  static success(title, duration = 1000) {
    setTimeout(() => {
      uni.showToast({
        title: title,
        icon: "success",
        mask: true,
        duration: duration
      });
    }, 300);
    if (duration > 0) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve();
        }, duration);
      });
    }
  }

  /**
   * 弹出确认窗口
   */
  static confirm(content, ops = {}, payload = {}) {
    return new Promise((resolve, reject) => {
      uni.$showModal({
        content: content,
        ...ops,
        success: res => {
          if (res.confirm) {
            resolve(payload);
          } else if (res.cancel) {
            reject(payload);
          }
        },
        fail: res => {
          reject(payload);
        }
      });
    });
  }

  static toast(title, onHide = undefined, icon = "none") {
    setTimeout(() => {
      uni.showToast({
        title: title,
        icon: icon,
        mask: true,
        duration:1500
      });
    }, 0);

    // 隐藏结束回调
    if (onHide) {
      setTimeout(() => {
        onHide();
      }, 1500);
    }
  }

  /**
   * 错误框
   */

  static error(title, onHide) {
    uni.showToast({
      title: title,
	  icon: 'error',
      mask: true,
      duration: 1500
    });
    // 隐藏结束回调
    if (onHide) {
      setTimeout(() => {
        onHide();
      }, 1500);
    }
  }

  /**
   * 弹出加载提示
   */
  static loading(title = "加载中") {
    if (Tips.isLoading) {
      return;
    }
    Tips.isLoading = true;
    uni.showLoading({
      title: title,
      mask: true
    });
  }

  /**
   * 加载完毕
   */
  static hideLoading() {
    if (Tips.isLoading) {
      Tips.isLoading = false;
      uni.hideLoading();
    }
  }
}

/**
 * 静态变量,是否加载中
 */
Tips.isLoading = false;

参考博客,在次基础上做了修改

相关推荐
蜡台20 分钟前
Android Gradle 项目下载编译失败解决---持续更新
android·java·kotlin·gradle
开心就好202533 分钟前
移动应用上架到应用商店的完整指南:原理与详细步骤
后端·ios
黄昏晓x1 小时前
C++11
android·java·c++
simplepeng2 小时前
TikTok 通过 Jetpack Compose 将代码大小减少 58%,并提升了新功能的 app 性能
android·android jetpack
毕设源码-钟学长2 小时前
【开题答辩全过程】以 基于Android的充电宝租赁管理软件的设计与实现为例,包含答辩的问题和答案
android
Be for thing2 小时前
Android 蓝牙 & WiFi 硬件原理 + 功耗与异常定位实战(手机 / 手表 / IoT 通用)
android·物联网·学习
wx_xsooop_wx2 小时前
iOS 被拒 4.3a Cocos【全面解读】
ios
00后程序员张2 小时前
使用克魔助手(Keymob)查看 iOS 设备日志与崩溃报告
android·macos·ios·小程序·uni-app·cocoa·iphone
__Yvan3 小时前
解决ConstraintLayout中LinearLayout显示异常问题
android·xml·约束布局
mjhcsp3 小时前
C++ A* 算法:启发式路径搜索的黄金标准
android·c++·算法