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

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

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

ios-uniapp 文件选取word,pdf,xls等文件 - DCloud 插件市场 uniapp iOS文件选取 iOS选取text,pdf,word,doc,xls,ppthttps://ext.dcloud.net.cn/plugin?id=1311

这个是返回一个 filePath 可用直接用于 uni.uploadFile 上传的路径,后面自己又改的File对象。

安卓部分主要通过使用 Android 平台的相关类来实现选择文件和获取文件本地路径的功能,

使用这些原生 Android 的类和方法,代码能够处理不同类型的文件选择器返回的文件 URI,并获取

文件的本地路径。根据文件的 URI 类型和授权部分,代码执行相应的处理逻辑,从而实现选择文

件和获取文件本地路径、File对象的功能。

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

示例代码:

   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)) {
              console.log('getAuthority:', uri.getAuthority())
              if (uri.getAuthority() == "com.android.externalstorage.documents") {
                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") {
                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") {
                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;
      }
    }

你可能感兴趣的:(uniapp,uni-app,ios,android)