uniapp sends full files to support App-side ios, android, WeChat applet, H5

Since the API provided by uniapp can only upload pictures and videos on the app side, and cannot upload other files, it can only be said that it can only use plug-ins.

 The plug-in used on the ios side gets the file object for free

ios-uniapp file selection word, pdf, xls and other files - DCloud plug-in market uniapp iOS file selection iOS selection text, pdf, word, doc, xls, ppt https://ext.dcloud.net.cn/plugin?id=1311

This is to return a filePath that can be directly used for uni.uploadFile upload path, and then modify the File object later.

The Android part mainly calls the native file system manager to select files through the plus object, and obtains the path and file object of the file. Call the pickFile.PickFile method to pick a file, and use the plus.io.resolveLocalFileSystemURL method. This method is used to convert the local file path into a file system URL and return the corresponding FileEntry object.

Wechat applets and H5 are simple, the API provided by uniapp can

Sample code:

<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':
            let permisionID = 'android.permission.READ_EXTERNAL_STORAGE'
            permision.requestAndroidPermission(permisionID)
              .then(res => {
                if (res == 1) {
                  this.chooseFileAndroid()
                } else {
                  uni.showModal({
                    title: '无法访问存储',
                    content: '您已经关闭存储权限,您已经关闭存储权限,请在"设置-隐私-存储"中允许访问存储',
                    success: (res) => {
                      if (res.confirm) {
                        // plus.runtime.openURL("package:");
                      } else if (res.cancel) {
                        plus.runtime.openURL("package:");
                        console.log('用户点击取消');
                      }
                    }
                  });
                }
              })
            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对象
                        // 可以在这里进行后续操作
                      }
                    });
                  }
                }
              });
            }
          });
      },


      // 安卓选择文件
      chooseFileAndroid() {
        /* eslint-disable */
        //调用原生文件系统管理器并选取文件获取文件地址
        var pickFile = {
          PickFile: function(callback,
            mimeTypes
          ) {
            /* 
              acceptType为你要查的文件类型"image/*","audio/*","video/*;image/*"  
              intent.setType("image/*");
              intent.setType("audio/*"); 
              选择音频 intent.setType("video/*;image/*"); 
              选择视频 (mp4 3gp 是android支持的视频格式) 
            */
            var CODE_REQUEST = 1000;
            var main = plus.android.runtimeMainActivity();
            if (plus.os.name == 'Android') {
              var Intent = plus.android.importClass('android.content.Intent');
              var intent = new Intent(Intent.ACTION_GET_CONTENT);
              intent.addCategory(Intent.CATEGORY_OPENABLE);
              if (mimeTypes) {
                intent.setType("*/*");
                intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
              } else {
                intent.setType("*/*");
              }
              let _this = pickFile;
              main.onActivityResult = function(requestCode, resultCode, data) {
                if (requestCode == CODE_REQUEST) {
                  var uri = data.getData();
                  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("版本大于 4.4");
                    if ("com.android.externalstorage.documents" == uri.getAuthority()) {
                      var docId = DocumentsContract.getDocumentId(uri);
                      var split = docId.split(":");
                      var type = split[0];

                      if ("primary" == type) {
                        var Environment = plus.android.importClass('android.os.Environment');
                        callback(Environment.getExternalStorageDirectory() + "/" + split[1]);
                      } else {
                        var System = plus.android.importClass('java.lang.System');
                        var sdPath = System.getenv("SECONDARY_STORAGE");
                        if (sdPath) {
                          callback(sdPath + "/" + split[1]);
                        }
                      }
                    } else if ("com.android.providers.downloads.documents" == uri.getAuthority()) {
                      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 ("com.android.providers.media.documents" == uri.getAuthority()) {
                      var docId = DocumentsContract.getDocumentId(uri);
                      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;
                      } else {
                        contentUri = MediaStore.Files.getContentUri("external");
                      }
                      console.log("版本大于 4.4", type);
                      var selection = "_id=?";
                      var selectionArgs = new Array();
                      selectionArgs[0] = split[1];

                      callback(_this.getDataColumn(main, contentUri, selection, selectionArgs));
                    }
                  } else if ("content" == uri.getScheme()) {
                    callback(_this.getDataColumn(main, uri, null, null));
                  } else if ("file" == uri.getScheme()) {
                    callback(uri.getPath());
                  }
                }
              }
              main.startActivityForResult(intent, CODE_REQUEST);
            }
          },

          getDataColumn: function(main, uri, selection, selectionArgs) {
            plus.android.importClass(main.getContentResolver());
            let cursor = main.getContentResolver().query(uri, ['_data'], selection, selectionArgs, null);
            plus.android.importClass(cursor);
            console.log(cursor);
            if (cursor != null && cursor.moveToFirst()) {
              var column_index = cursor.getColumnIndexOrThrow('_data');
              var result = cursor.getString(column_index)
              cursor.close();
              return result;
            }
            return null;
          }
        }
        /* eslint-disable no-new */
        // 拿到文件路径后,获取文件对象file
        pickFile.PickFile((path) => {
          //返回的路径 
          console.log(path);
          plus.io.resolveLocalFileSystemURL(path, (entry) => {

            entry.file((file) => {
              // file 对象即为所需的文件对象
              console.log("文件对象:", file);
              // 可以在这里进行后续操作
            }, (error) => {
              console.log("获取文件对象出现异常", error);
            });
          }, (error) => {
            console.log("解析本地文件路径出现异常", error);
          });
        }, '*/*')
      },
    }

Guess you like

Origin blog.csdn.net/weixin_44523517/article/details/131580335