第一次写CSDN,有什么写的不清楚的地方大家指点。
我本是做前端的,干了6年左右,前一阵接了个私活,做微信小程序。技术上小程序用的原生+vant,后台管理系统用的Vue+Element,本来是前后端分离按照正常流程去做,结果后端拉胯走了(He Tui~),最后因为前期用户量并不多,决定用小程序云开发先挺过这段时间。
虽然小程序干了不老少,后端只会Python,但是我也是第一次用云开发写后端逻辑和操作数据库,不太熟悉,感觉会遇到很多坑,这就遇到了上传这个大坑。
功能需求:小程序端是一般的表单提交+上传最多三张图片,后台管理系统也有上传,要求通过云开发中部署静态网站,调用云函数完成所有数据交互。
碎碎念:接活之前已经用测试账号做过技术验证,也没什么问题,但是心里总有一种不安,感觉上传这块要遇大坑,想什么来什么。
由于是第一次做,肯定前期会看很多相应的文章或者逛逛社区,总的来讲网上的文章目前可以分为三类:
方法1,从想法到放弃
上边也说了,我们完全没有后端,而且也确实需要web调用云函数,并且我希望所有数据库操作和上传等均在云函数中进行。所以在web端只用SDK调callFunction方法去做数据交互,再加上权限等问题果断放弃方法1。有老大就要说了,那就用先用wx.cloud.uploadFile解决小程序后边再说嘛,反正早晚也得解决,不如直接解决了算了(我不,强迫症,爱咋咋地)。
方法2,从验证成功到莫名报错到放弃
对于没有干过的技术方案怎么能不认真验证可行性呢,坑了甲方咋办!(主要是怕扣我钱,我的小钱钱~),咳咳,言归正传。
总的思路是这样的:(前期云开发准备工作跳过,自己搜去)
(1)首先通过wx.chooseImage选择图片
chooseImages(){
let _this = this
wx.chooseImage({
count: 3,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success(res){
const tempFilePaths = res.tempFilePaths
_this.setData({
images: tempFilePaths
})
}
})
}
(2)使用 wx.getFileSystemManager().readFile()将图片转成base64字符串,然后callFunction传过去,如果多张上传就循环。
getImageBase64(){
wx.getFileSystemManager().readFile({
filePath: images,
encoding: 'base64',
success(response){
wx.cloud.callFunction({
name: 'quickstartFunctions',
config: {
env: '******'
},
data: {
type: 'uploadPicture',
path: 'images/test.png',
file: response.data
},
success(res) {
console.log(res)
}
})
}
})
}
(3)在云函数中接到base64然后转回来上传
const cloud = require('wx-server-sdk');
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
});
exports.main = async (event, context) => {
try {
return await cloud.uploadFile({
cloudPath: event.path,
fileContent: Buffer.from(event.file, 'base64')
})
} catch (e) {
return e;
}
}
神奇的来了,技术验证顺风顺水,在实际开发中,CV大法过来改了改,结果报!错!了!连云函数都没进去。报了-404006

面向百度变成的我,百了各种度,都没找到原因,但是只要不传base64就能进云函数,明明验证的代码还在那摆着,可他依旧报错坚挺,而且至今都不知道为啥(有知道的告诉告诉孩子吧,孩子不容易啊)
既然找不到原因那就果断放弃吧,毕竟世上无难事,只要肯放弃,我转向了方法3
方法3,从瞎蒙到抓狂到成功
官方对wx.cloud.CDN的定义是这样的↓↓↓↓↓↓↓↓↓↓↓↓

示例代码更是简单的不能再简单

OK,我们能从这上边得出什么呢?当然啥都看不出来,TX技术文档某些部分的模糊程度大家都懂的,反正我看的云里雾里的。简单来说呢,wx.cloud.CDN需要放在wx.cloud.callFunction中用,就是用来传大文件的,它会在云函数中对应字段返回一个地址,通过地址拿到你传的数据,但是怎么拿,他!没!说!(Tui~)
下面看我的代码,由于昨天弄了一天,虽然也是按照CDN方式弄的,但是图片无法查看。今天莫名其妙的调试成功了,还没来得及整理代码(凑合看吧)

获取图片的步骤跟上边一样,可是为什么不用现成的代码块可以复制粘贴呢,因为我不想让你们粘,主要看imageUpload中的代码,最后我会解释为啥我上边刚说的wx.cloud.callFunction用,这就出幺蛾子了。
解释一下,一共三个参数,file,path,suffix。file是CDN地址,把chooseImage获取的图片临时文件地址放入CDN中,返回个地址当做参数传到云函数中,path是云储存的地址,我只传了一个文件夹地址,剩下的交给云函数生成,suffix是文件后缀,我也不知道传的png还是jpg,而且保证上传的复用性,所以获取了个后缀一起传过去了,就这么简单。
重点来了,怎么获取CDN地址中的数据嘞~有请axios,熟悉不,就是Vue中的axios,请求一下子不就好了。抄家伙!在云函数中安装依赖npm install axios --save,先安上,要不准报错undefined。
也有人用got,我也用过了,不知道是不是版本原因不能用require引入,云函数又不能import,放弃。经过我的不懈努力!OK看代码
const cloud = require('wx-server-sdk')
const PARAMS = require('../params.json') // 配置JSON
const SendData = require('../sendData/index') // 发送数据回来的函数,加了code和是否成功
const axios = require('axios') // 引入axios
cloud.init({
env: PARAMS.env
})
exports.main = async (event, context) => {
try {
// cloud.uploadFile可以接arraybuffer,所以获取类型设置为arraybuffer
let imgBuffer = await axios({
method:'get',
url:event.data.file,
responseType: 'arraybuffer',
headers: { "Content-Type": "*" },
})
// 上传
const cloudId = await cloud.uploadFile({
cloudPath: event.data.path+'U'+Date.now()+event.data.suffix,
fileContent: Buffer.from(imgBuffer.data)
})
// 成功后返回云储存的fileID
return SendData(cloudId.fileID)
} catch (e) {
return SendData('图片上传失败', 200, false)
}
}
看看储存里,这就上传成功了。
函数SendData中return的就是个JSON不用纠结我怎么写的,我只是懒。
刚才上边说CDN只能放在callFunction中使用,但是我放在了imageUpload中,心机之蛙一直摸你肚子!这就是我自己封装的,咳咳。我可不想每次都得写wx.callFunction巴拉巴拉,呸,代码太多了!
其实本质就是callFunction,简单介绍一下我的做法,我将callFunction封装成了一个函数Call,把请求的云函数名和数据等进行操作整理,还有自定义loading文字,然后把Call暴露出来,建立api文件夹,引入Call,把所有的交互函数当做api一样进行统一管理。如果大家有兴趣我抽空可以把代码扔出来大家喷喷。
如果大家觉得有帮助,做后台管理系统接口的时候再发一期怎么在vue项目中使用云函数,并且部署,我去整理代码,继续搬砖了,散会
碎碎念:也不一定会有第二期,毕竟我懒
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同