uni-app schema2code生成vue3页面uni-file-picker有问题,还是我的代码有问题,麻烦帮看看

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app schema2code生成vue3页面uni-file-picker有问题,还是我的代码有问题,麻烦帮看看

图片上传问题

用以下代码通过schema2code生成add.vue,上传不管是jpg,还是png图片,都显示图片类型无效。是我的schema代码哪里出错了么研究了很久文档也没研究出所以然。

Schema 代码

{
  "bsonType": "object",
  "required": ["tupian"],
  "properties": {
    "tupian": {
      "bsonType": "string",
      "title": "图片",
      "description": "仅支持上传一张图片,大小不超过500KB",
      "componentForEdit": {
        "name": "uni-file-picker",
        "props": {
          "fileType": "image",
          "extname": ".jpg,.jpeg,.png,.gif",
          "limit": 1,
          "maxSize": 512000,  // 500KB = 500 * 1024 字节
          "autoUpload": true,
          "returnFilePath": true
        },
        "events": {
          "success": "handleFileSuccess",
          "fail": "handleFileFail"
        }
      },
      "componentForShow": {
        "name": "image",
        "props": {
          "class": "admin-list-image",
          "mode": "aspectFill",
          ":src": "item.tupian"
        }
      }
    }
  }
}

add.vue 代码

模板部分

<template>
  <view class="uni-container">
    <uni-forms ref="form" :model="formData" validateTrigger="bind">
      <uni-forms-item name="tupian" label="图片" required>
        <uni-file-picker 
          fileType="image" 
          extname=".jpg,.jpeg,.png,.gif" 
          limit="1" 
          maxSize="500 * 1024" 
          autoUpload="true" 
          returnFilePath="true" 
          placeholder="仅支持上传一张图片,大小不超过500KB" 
          v-model="formData.tupian"
        />
      </uni-forms-item>
      <view class="uni-button-group">
        <button type="primary" class="uni-button" style="width: 100px;" @click="submit">提交</button>
        <navigator open-type="navigateBack" style="margin-left: 15px;">
          <button class="uni-button" style="width: 100px;">返回</button>
        </navigator>
      </view>
    </uni-forms>
  </view>
</template>

脚本部分

<script>
import { validator } from '../../js_sdk/validator/atupian.js';

const db = uniCloud.database();
const dbCmd = db.command;
const dbCollectionName = 'atupian';

function getValidator(fields) {
  let result = {};
  for (let key in validator) {
    if (fields.includes(key)) {
      result[key] = validator[key];
    }
  }
  return result;
}

export default {
  data() {
    let formData = {
      "tupian": ""
    };
    return {
      formData,
      formOptions: {},
      rules: {
        ...getValidator(Object.keys(formData))
      }
    };
  },
  onReady() {
    this.$refs.form.setRules(this.rules);
  },
  methods: {
    submit() {
      uni.showLoading({
        mask: true
      });
      this.$refs.form.validate().then((res) => {
        return this.submitForm(res);
      }).catch(() => {
      }).finally(() => {
        uni.hideLoading();
      });
    },
    submitForm(value) {
      return db.collection(dbCollectionName).add(value).then((res) => {
        uni.showToast({
          title: '新增成功'
        });
        this.getOpenerEventChannel().emit('refreshData');
        setTimeout(() => uni.navigateBack(), 500);
      }).catch((err) => {
        uni.showModal({
          content: err.message || '请求服务失败',
          showCancel: false
        });
      });
    }
  }
};
</script>

开发环境与版本信息

项目创建方式 版本号
使用 schema2code 生成 未指定版本号

2 回复

参考文档 https://uniapp.dcloud.net.cn/component/uniui/uni-file-picker.html#介绍 重命名 mediatype 为 file-mediatype, extname 为 file-extname
“bsonType”: “file” 仅限单个文件,如果是多个文件需要调整为 “bsonType”: “array”, “arrayType”: “file”


针对你提到的 uni-app schema2code 生成 vue3 页面中的 uni-file-picker 组件可能存在的问题,我将提供一个基础的 uni-file-picker 使用示例,并附上相关代码,帮助你排查问题。如果问题依旧存在,那么可能是 schema2code 工具本身的问题。

首先,确保你的 uni-app 项目已经正确安装并配置了 uni-file-picker 组件。如果未安装,可以通过以下命令安装:

npm install @dcloudio/uni-ui

然后,在项目的 pages.json 中引入 uni-ui 组件库(如果尚未引入):

"easycom": {
    "autoscan": true,
    "custom": {
        "^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
    }
}

接下来,是一个使用 uni-file-picker 的简单示例代码。创建一个新的 Vue 3 页面,例如 pages/filePicker/filePicker.vue

<template>
  <view class="content">
    <uni-file-picker
      :count="5"
      :mode="['image', 'video']"
      :limit="20 * 1024 * 1024"
      @change="handleFileChange"
    >
      <button type="primary">选择文件</button>
    </uni-file-picker>
    <view v-for="(file, index) in files" :key="index" class="file-item">
      <image :src="file.url" mode="aspectFill" style="width: 100px; height: 100px;"></image>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      files: []
    };
  },
  methods: {
    handleFileChange(e) {
      this.files = e.detail.files;
    }
  }
};
</script>

<style scoped>
.content {
  padding: 20px;
}
.file-item {
  display: flex;
  margin-top: 10px;
  justify-content: center;
}
</style>

这个示例展示了如何使用 uni-file-picker 组件来选择图片或视频文件,并在页面上显示所选文件的缩略图。

请检查以下几点:

  1. 确保 uni-file-picker 组件的属性和事件绑定正确。
  2. 确保 handleFileChange 方法能够正确接收到文件列表。
  3. 检查控制台是否有错误信息,特别是关于 uni-file-picker 的。

如果以上代码在你的项目中运行正常,但 schema2code 生成的代码有问题,那么可能是 schema2code 工具在生成代码时存在某些特定的配置或兼容性问题。你可以尝试调整 schema2code 的配置或更新到最新版本。如果问题依旧,建议向 uni-app 社区或官方反馈此问题。

回到顶部