uniapp 发送全文件 支持App端ios、android,微信小程序,H5

news2024/11/16 21:45:25

由于uniapp提供的API在app端只能上传图片和视频,不能上传其他文件,说以只能借助插件了。

 ios端用的这个插件 获取到文件对象 免费的

这个是返回一个 filePath 可用直接用于 uni.uploadFile 上传的路径,后面自己又改的File对象 全文件上传选择非原生2.0版 - DCloud 插件市场文件选择上传-支持APP-H5网页-微信小程序https://ext.dcloud.net.cn/plugin?id=5459

 安卓部分主要通过使用 Android 平台的相关类来实现选择文件和获取文件本地路径的功能,使用这些原生 Android 的类和方法,代码能够处理不同类型的文件选择器返回的文件 URI,并获取文件的本地路径。根据文件的 URI 类型和授权部分,代码执行相应的处理逻辑,从而实现选择文件和获取文件本地路径、File对象的功能。

微信小程序和H5那就简单了uniapp提供的API就可以

<template>
  <view class="">
    <view class="" @click="sendFile">
      <text>获取文件</text>
    </view>
  </view>
</template>

   methods: {
      sendFile() {
        // #ifdef H5
        uni.chooseFile({
          count: 1,
          // extension:['.zip','.doc'],
          success: (res) => {
            console.log(res);
            console.log('file:', res.tempFiles[0]); // File对象
          }
        });
        // #endif

        // #ifdef MP-WEIXIN
        console.log('WEIXIN');
        wx.chooseMessageFile({
          count: 10,
          type: 'file',
          success: (res) => {
            console.log('file:', res.tempFiles[0]); // File对象
          }
        })
        // #endif

        // #ifdef APP-PLUS
        switch (uni.getSystemInfoSync().platform) {
          case 'android':
            this.chooseFile((path) => {
              console.log('文件本地路径:', path);
              plus.io.requestFileSystem(plus.io.PRIVATE_DOC, (fs) => {
                fs.root.getFile(path, {
                  create: true
                }, (fileEntry) => {
                  fileEntry.file((file) => {
                    let fileReader = new plus.io.FileReader();
                    console.log(file);
                    console.log(fileReader);
                    console.log("文件对象:" + JSON.stringify(file)); // File对象
                  }, (error) => {
                    console.log("读写出现异常", error);
                  });
                });
              });
            })
            break;
          case 'ios':
            this.filePathIos()
            break;
        }
        // #endif
      },

      // ios 选择文件
      filePathIos() {
          // 示例代码:
          const iOSFileSelect = uni.requireNativePlugin('YangChuan-YCiOSFileSelect');
          // apple document-types 文件类型参数 https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html
          // 文件类型参数
          let params = {
            "document-types": ["public.text", "public.zip", "public.data", "com.adobe.pdf",
              "com.microsoft.word.doc", "com.adobe.postscript", "com.microsoft.excel.xls",
              "com.adobe.encapsulated- postscript", "com.microsoft.powerpoint.ppt",
              "com.adobe.photoshop- image", "com.microsoft.word.rtf", "com.microsoft.advanced- systems-format",
              "com.microsoft.advanced- stream-redirector"
            ],
            "isBase64": 0
          }
          iOSFileSelect.show(params, result => {
            let status = parseInt(result.status);
            // 状态200选取成功
            if (status == 200) {
              let url = result.url;
              uni.downloadFile({
                url: url,
                success: (res) => {
                  if (res.statusCode == 200) {
                    // filePath 可用于 uni.uploadFile 上传的路径
                    let filePath = res.tempFilePath;
                    let name = filePath.split("/")[filePath.split("/").length - 1];
                    console.log(result);
                    const uploadTask = uni.uploadFile({
                      url: 'https://上传接口', //仅为示例,非真实的接口地址
                      filePath: filePath,
                      name: 'file',
                      formData: {
                        'user': 'test'
                      },
                      success: (uploadFileRes) => {
                        console.log(uploadFileRes.data);
                      }
                    });

                    uploadTask.onProgressUpdate((res) => {
                      console.log(res);
                      console.log('上传进度' + res.progress);
                      console.log('已经上传的数据长度' + res.totalBytesSent);
                      console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend);
                      // 测试条件,取消上传任务。
                      if (res.progress > 1) {
                        uploadTask.abort();
                        let size = res.totalBytesExpectedToSend
                        let file = {
                          path: filePath,
                          name: name,
                          size: size,
                          type: 'file'
                        }
                        console.log(file); // File对象
                      }
                    });
                  }
                }
              });
            }
          });
      },


      // 安卓选择文件
      chooseFile(callback) {
        console.log('choodeFile')
        var CODE_REQUEST = 1000;
        var main = plus.android.runtimeMainActivity();
        var Intent = plus.android.importClass('android.content.Intent');
        var intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        main.onActivityResult = (requestCode, resultCode, data) => {
          if (requestCode == CODE_REQUEST) {
            var uri = data.getData();
            console.log('uri:', uri)
            // uri是编码过的,需要转换为本地路径
            plus.android.importClass(uri);
            var Build = plus.android.importClass('android.os.Build');
            var isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

            var DocumentsContract = plus.android.importClass('android.provider.DocumentsContract');
            if (isKitKat && DocumentsContract.isDocumentUri(main, uri)) {
              // DocumentProvider
              console.log('getAuthority:', uri.getAuthority())
              if (uri.getAuthority() == "com.android.externalstorage.documents") {
                // ExternalStorageProvider
                let docId = DocumentsContract.getDocumentId(uri);
                let split = docId.split(":");
                let type = split[0];

                if (type === "primary") {
                  let Environment = plus.android.importClass('android.os.Environment');
                  callback(Environment.getExternalStorageDirectory() + "/" + split[1]);
                } else {
                  let System = plus.android.importClass('java.lang.System');
                  let sdPath = System.getenv("SECONDARY_STORAGE");
                  if (sdPath) {
                    callback(sdPath + "/" + split[1]);
                  }
                }
              } else if (uri.getAuthority() == "com.android.providers.downloads.documents") {
                // DownloadsProvider
                var id = DocumentsContract.getDocumentId(uri);
                var ContentUris = plus.android.importClass('android.content.ContentUris');
                var contentUri = ContentUris.withAppendedId(
                  Uri.parse("content://downloads/public_downloads"), id);
                callback(this.getDataColumn(main, contentUri, null, null));
              } else if (uri.getAuthority() == "com.android.providers.media.documents") {
                // MediaProvider
                var docId = DocumentsContract.getDocumentId(uri);
                console.log('docId:', docId)
                var split = docId.split(":");
                var type = split[0];
                var MediaStore = plus.android.importClass('android.provider.MediaStore');
                if ("image" == type) {
                  contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video" == type) {
                  contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio" == type) {
                  contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                var selection = "_id=?";
                var selectionArgs = new Array();
                selectionArgs[0] = split[1];
                callback(this.getDataColumn(main, contentUri, selection, selectionArgs))
              }
            } else if (uri.getScheme() == "content") {
              if (uri.getAuthority() == "media") {
                callback(this.getDataColumn(main, uri, null, null));
              } else {
                callback(uri.getPath());
              }
            } else if (uri.getScheme() == "file") {
              // File
              console.log("file");
              callback(uri.getPath());
            }
          }
        }
        main.startActivityForResult(intent, CODE_REQUEST);
      },
      // main, uri, selection, selectionArgs
      getDataColumn(main, uri, selection, selectionArgs) {
        plus.android.importClass(main.getContentResolver());
        var cursor = main.getContentResolver().query(uri, ['_data'], selection, selectionArgs, null);
        plus.android.importClass(cursor);
        if (cursor != null && cursor.moveToFirst()) {
          var column_index = cursor.getColumnIndexOrThrow('_data');
          var result = cursor.getString(column_index)
          cursor.close();
          return result;
        }
        return null;
      }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAD绘制三维升旗台

首先绘制长方体的底座 用交叉对角线来定位&#xff0c;绘制一个小一点的矩形&#xff0c;用来定位 大概的效果&#xff1a; 沿着矩形的一个角绘制三个长方体&#xff0c;形成护栏 用阵列或者复制等形成四个角的护栏 旋转&#xff0c;换成真实的效果图&#xff1a; 添加一个圆…

文件共享平台Pingvin Share

本文完成于 2 月上旬。最近正好应网友要求折腾了 ClamAV&#xff0c;所以翻出来一起发了&#xff0c;可以作为 ClamAV 的一个应用示例&#xff1b; 什么是 Pingvin Share &#xff1f; Pingvin Share 是自托管文件共享平台&#xff0c;是 WeTransfer 的替代品。使用 Pingvin Sh…

【C语言基础】遍历

(꒪ꇴ꒪(꒪ꇴ꒪ ),我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&…

S7-1200与ABB机器人进行SOCKET通信的具体方法示例

S7-1200与ABB机器人进行SOCKET通信的具体方法示例 SOCKET通信是一种基于TCP/IP协议的通信方式,提供了程序内部与外界通信的端口并为通信双方提供了数据传输通道。 ABB机器人实现SOCKET通信必须要在Communication选项中勾选616-1 PC Interface选项功能。 具体方法可参考以下内容…

SpringBoot+Vue酒店客房管理系统

&#x1f495;&#x1f495;作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&…

从YOLOv1到YOLOv8的YOLO系列最新综述【2023年4月】

作者&#xff1a;Juan R. Terven 、Diana M. Cordova-Esparaza 摘要&#xff1a;YOLO已经成为机器人、无人驾驶汽车和视频监控应用的核心实时物体检测系统。我们对YOLO的演变进行了全面的分析&#xff0c;研究了从最初的YOLO到YOLOv8每次迭代的创新和贡献。我们首先描述了标准…

Python 中的二维插值

本文展示了如何在 Python 中进行插值&#xff0c;并研究了不同的 2d 实现方法。 我们将讨论用于双变量插值的有用函数&#xff0c;例如 scipy.interpolate.interp2d、numpy.meshgrid 和 Python 中使用的用于平滑/插值 (RBF) 的径向基函数。 我们将使用 SciPy 和 Numpy 库实现插…

树莓派配置ubuntu server 22.04环境

背景 比起raspberry系统ubuntu更通用&#xff0c;结合公司项目开发需要&#xff0c;将树莓派4B刷上ubuntu server系统&#xff0c;并且安装LXDE桌面环境。 一波next 烧写镜像 用树莓派镜像烧录软件安装比较简单&#xff0c;选择操作系统&#xff1a;Other general-purpose O…

python psutil模块常用方法

psutil 是一个功能强大的跨平台第三方库&#xff0c;用于检索系统相关信息和进程管理。它提供了一些方便的函数和方法&#xff0c;可以获取 CPU 使用率、内存使用情况、磁盘信息、网络统计数据以及进程列表等。 1. 安装psutil pip install psutil2. 获取 CPU 使用率 import p…

flutter聊天界面-聊天列表 下拉加载更多历史消息

flutter聊天界面-聊天列表 下拉加载更多历史消息 在之前实现了flutter聊天界面的富文本展示内容、自定义表情键盘实现、加号【➕】更多展开相机、相册等操作Panel、消息气泡展示实现Flexible。这里把实现的聊天界面的滑动列表及下拉加载更多历史消息记录一下 聊天界面的列表使…

MySQL索引优化原则和失效情况

目录 1. 全值匹配2. 最佳左前缀法则3. 不要在索引列上做任何计算4. 范围之后全失效5. 尽量使用覆盖索引6. 使用不等于&#xff08;!或<>&#xff09;会使索引失效7. is null 或 is not null也无法使用索引8. like通配符以%开头会使索引失效9. 字符串不加单引号导致索引失…

程序员的悲哀是什么?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 切记&#xff0c;任何文章不要过度深思&#xff08;任何东西都无法经得起审视&#xff0c;因为这世上没有同样的成长环境&#xff0c;也没有同样的认知水平同时也「没有适用于所…

大模型高效训练基础知识:梯度累积(Gradient Accumulationn)

梯度累积 梯度累积&#xff08;Gradient Accumulation&#xff09;的基本思想是将一次性的整批参数更新的梯度计算变为以一小步一小步的方式进行&#xff08;如下图&#xff09;&#xff0c;具体而言该方法以小批次的方式进行模型前向传播和反向传播&#xff0c;过程中迭代计算…

变革管理中的几个不错的模型小结

其他的变革模型&#xff1a; 变革管理流程&#xff1a;

二、Java的变量

二、变量 2.1、关键字与保留字 关键字 定义&#xff1a;赋予特殊含义&#xff0c;用做专门用途的字符串 特点&#xff1a;关键字的所有字母都为小写 保留字&#xff08;reserved word&#xff09; 现有Java版本尚未使用&#xff0c;但以后版本可能会作为关键字使用。自己命名…

使用PYQT制作人才交流管理系统

利用使用PYQT制作一个人才交流管理系统&#xff0c;先使用QT designer.exe设计好人才交流管理系统的各个UI界面&#xff0c;然后利用pyuic把生成的ui界面编译为py文件&#xff0c;在主函数文件内创建一个类继承ui.py界面的类&#xff0c;即可完成数据库逻辑与 GUI 代码分离&…

小米不再忍耐,裁员三分之一强势反击印度,印度制造或因此梦破

就在小米公司表态继续投资印度之后不久&#xff0c;印度媒体报道指小米印度公司的员工数量从1500人减少到1000人左右&#xff0c;这显示出小米开始强势反击印度&#xff0c;业界人士指出此举的影响远不止于此&#xff0c;结果很可能是导致印度制造的梦想破灭。 1.小米为印度手机…

软件工程——第9章面向对象方法学引论知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.当前最好的软件开发技术是&#xff1f; 2.面向对象的原则是什么&#xff1f; 3.人们把客观世界中的实体抽象为什么&#xff1f; 4.软件系统本质上…

主诉病程时长提取

编写Python函数 import re def structured_pro(original_text,keyword,out_unitNone):pattern_split_str[。&#xff0c;]pattern_splitre.compile(pattern_split_str,re.I|re.M)original_listpattern_split.split(original_text)pattern_keywordre.compile(keyword,re.I|re.M…

目前最好的MicrosoftProject替代方案

Microsoft Project是一个功能强大的项目管理工具。然而它可能是昂贵的&#xff0c;并且可能不适合所有的项目管理需求。幸运的是&#xff0c;有几个Microsoft Project的替代方案提供了类似的特性和功能。在本文中我们将探索目前可用的一些最好的Microsoft Project替代方案。 1、…