<template> <button @click="changeMessage">选择文件</button> <view v-show="false" :path="path" :change:path="requestModule.uploadOBS"></view> </template> <script setup> import { ref } from 'vue' import { getCurrentInstance } from 'vue' const { proxy } = getCurrentInstance() // 把回调挂到实例上,renderjs 就能通过 callMethod 调到 proxy.$onRenderData = (data) => { console.error('str:', data) } const path = ref(null) const changeMessage = () => { uni.chooseImage({ count: 1, // 最多选择数量 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机 success: async (res) => { // tempFilePath 可以作为 img 标签的 src 属性显示图片 const tempFilePaths = res.tempFilePaths path.value = tempFilePaths[0]; }, fail: (err) => { console.error('选择图片失败:', err) } }) } </script> <script> // 专门给 renderjs 回调用 ownerVm.callMethod('onRenderData', "999999") 就能调到 /* export default { methods: { onRenderData(data) { console.error('str:', data) } } } */ </script> <script module="requestModule" lang="renderjs"> export default { methods: { /* 1. 逻辑层 → renderjs */ uploadOBS(newVal, oldVal, ownerVm, vm) { console.error('path:', newVal) this.getFileAsArrayBuffer2(newVal).then(res => { console.error('arrayBuffer:', res) return this.uploadArrayBuffer(res,'https://jszj-dev.obs.cn-east-3.myhuaweicloud.com/2011725287372374017/jszj_lp_merchant_apply_for_application_materials_file_id/20260116/1762482093185_1768566856106.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260116T123416Z&X-Amz-SignedHeaders=host&X-Amz-Credential=HPUAACHPJ15SJKPZGOAP%2F20260116%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=86400&X-Amz-Signature=29eb09d67a7bf73afb199e75148c57d73d13d65146fe6bd351b479cc0ebd66d1','image/jpeg'); }).then(res => { console.error('upload:', res) }).catch(err => { }) //调用vue2方法 //ownerVm.callMethod('onRenderData', "999999") //调用vue3方法 ownerVm.callMethod('$onRenderData', "999999") }, getFileAsArrayBuffer2(filePath) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest() xhr.open('GET', filePath, true) xhr.responseType = 'arraybuffer' xhr.onload = function() { if (xhr.status === 200) { resolve(xhr.response) } else { reject(new Error('Failed to load file')) } } xhr.onerror = function() { reject(new Error('Network error')) } xhr.send() }) }, uploadArrayBuffer(arrayBuffer, uploadUrl, fileType = 'application/octet-stream') { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); /* 1. 打开连接 */ xhr.open('PUT', uploadUrl, true); /* 2. 设置请求头 */ xhr.setRequestHeader('Content-Type', fileType); /* 3. 响应类型(按需要) */ xhr.responseType = 'arraybuffer'; /* 4. 上传进度 */ xhr.upload.onprogress = function(e) { if (e.lengthComputable) { const percent = (e.loaded / e.total) * 100; console.log('上传进度:', percent.toFixed(2) + '%'); } }; /* 5. 成功/失败 */ xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { resolve(xhr.response); // 服务端返回的 ArrayBuffer } else { reject(new Error(`上传失败 ${xhr.status}`)); } }; xhr.onerror = () => reject(new Error('网络错误')); /* 6. 发送二进制 */ xhr.send(arrayBuffer); }); } } } </script> <style> </style>uniapp 使用 XMLHttpRequest发送二进制上传文件 可使用预上传接口上传到华为obs
张小明
前端开发工程师
SAM3迁移指南:从传统CV方法到AI分割模型
SAM3迁移指南:从传统CV方法到AI分割模型 1. 技术背景与核心价值 计算机视觉领域长期依赖传统图像分割方法,如基于边缘检测的Canny算法、区域生长法以及分水岭算法等。这些方法在特定场景下表现稳定,但普遍存在泛化能力弱、对光照和背景敏感…
AI图像处理实战:集成Rembg的证件照生成系统部署教程
AI图像处理实战:集成Rembg的证件照生成系统部署教程 1. 引言 1.1 业务场景描述 在日常办公、求职申请、证件办理等场景中,标准证件照是不可或缺的基础材料。传统方式依赖照相馆拍摄或使用Photoshop手动处理,存在成本高、效率低、隐私泄露风…
Supertonic技术揭秘:如何实现167倍实时速度的TTS
Supertonic技术揭秘:如何实现167倍实时速度的TTS 1. 引言:设备端TTS的性能革命 随着边缘计算和本地化AI应用的兴起,文本转语音(Text-to-Speech, TTS)系统正从云端向设备端迁移。用户对低延迟、高隐私性和离线可用性的…
知北知雁发音人切换技巧:Sambert情感控制详细步骤解析
知北知雁发音人切换技巧:Sambert情感控制详细步骤解析 1. 引言 1.1 Sambert 多情感中文语音合成——开箱即用版 随着AI语音技术的快速发展,高质量、多情感、可定制化的文本转语音(TTS)系统已成为智能客服、有声读物、虚拟主播等…
PDF-Extract-Kit表格识别精度提升秘籍
PDF-Extract-Kit表格识别精度提升秘籍 1. 背景与挑战:PDF文档结构化提取的痛点 在企业级文档处理、金融报表分析、科研数据整理等场景中,PDF作为最常见的文档格式之一,承载了大量非结构化信息。其中,表格数据因其复杂的布局、跨…
通义千问2.5-7B-Instruct如何提速?Tensor Parallel实战优化
通义千问2.5-7B-Instruct如何提速?Tensor Parallel实战优化 1. 背景与挑战:为何需要对Qwen2.5-7B-Instruct进行推理加速 1.1 模型能力与部署瓶颈的矛盾 通义千问 2.5-7B-Instruct 是阿里于 2024 年 9 月发布的 70 亿参数指令微调模型,定位…