ThinkPHP6接收图片base64进行文件上传
ThinkPHP6接收图片base64进行文件上传。
解决场景: 前端生成一个canvas图片后,传给后端是一串图片的base64字符串,常规的文件上传无法获取到这个文件。
于是,将base64保存到临时文件夹后,再转成一个thinkphp6上传文件类的对象,模拟上传文件。
$name = 'file';// 优先从请求中获取的上传文件$this->file = Request::file($name);// 如果请求中没有获取文件流, 尝试在表单中获取同等的base64if (empty($this->file)) { $str = Request::post($name); $result = img_base64_2_binary($str, public_path('temp')); $result !== false && $this->file = new \think\file\UploadedFile($result, basename($result)); // ...
RESTfulAPI设计指南
RESTful API前后端分离的趋势下,RESTfulAPI是一套比较成熟的互联网应用程序的API设计理论。
http动词
GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。
示例
GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
状态码返回
200 OK - [GET]:服务器成功返回用户请求的数据 ...
接口幂等性设计
接口幂等性设计
一个操作一次执行的结果和多次执行的结果一致。
问题引出常见场景1、订单创建接口,第一次调用超时了,然后调用方重试了一次2、在订单创建时,我们需要去扣减库存,这时接口发生了超时,调用方重试了一次3、当这笔订单开始支付,在支付请求发出之后,在服务端发生了扣钱操作,接口响应超时了,调用方重试了一次4、一个订单状态更新接口,调用方连续发送了两个消息,一个是已创建,一个是已付款。但是你先接收到已付款,然后又接收到了已创建5、在支付完成订单之后,需要发送一条短信,当一台机器接收到短信发送的消息之后,处理较慢。消息中间件又把消息投递给另外一台机器处理
出现的本质
前端重复提交
接口超时重试
消息重复消费
http请求的幂等
GET
天生幂等,多次请求不会变更数据,只是每次请求返回的数据结果不同而已。
POST
每次请求会产生新的数据,所以不是幂等的
PUT
增量更新:不幂等
每次更新时,如果不存在记录,则增加一条数据
存量更新:幂等
因为每次存量更新时,目的是为了把数据更改到某个状态。
DELETE
每次操作的目的是删除数据,对数据结果产生的作用 ...
go基础整理
本章节内容来自《菜鸟教程》,并经过整理后记录
数据类型
布尔型
数字类型
字符串类型
派生类型
指针类型
数组类型
结构化类型
Channel类型
函数类型
切片类型
接口类型
Map类型
变量
全局变量允许声明而不使用,但是局部变量声明则必须使用
var identifier type# 例如var a inta = 1b := 2fmt.Println(a, b)
package mainvar ( x int y bool)func main() { var a, b int c := "shayvmo" fmt.Println(a, b, c, x, y)}// 输出0 0 shayvmo 0 false
常量const identifier [type] = value// 显式类型定义const a string = "abc"// 隐式类型定义const b = 4
iota
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),co ...
Go语言中import导入包时:点. 、下划线_ 、别名的用法
Go语言中import导入包时:点. 、下划线_ 、别名的用法转载于:https://blog.csdn.net/qq_42346574/article/details/112260070
刚接触Go的时候,在看别人的项目源码时,发现在import包的包名前面有一个下划线_,产生疑问,于是搜索查阅资料。
以下示例代码在转载地址:
import ( v2 "github.com/YFJie96/wx-mall/controller/api/v2" _ "github.com/YFJie96/wx-mall/docs" . "fmt" "github.com/gin-gonic/gin" "github.com/swaggo/gin-swagger" "github.com/swaggo/gin-swagger/swaggerFiles")
相关资料说明:
别名v2:
相当于是导入包的一个别名,可以直接使用v2.调用包内接口或方法。
下划线_:
在导入路径前加入 ...
go mod 设置代理 goproxy
采用七牛云方案。
https://goproxy.cn/
go env -w GO111MODULE=ongo env -w GOPROXY=https://goproxy.cn,direct
macOS 或者 Linux
打开终端执行
export GO111MODULE=onexport GOPROXY=https://goproxy.cn
还是回来Hexo啦,方便检索文章
兜兜转转,还是回来用Hexo啦,熟悉的Markdown,熟悉的配方
PayPal支付对接
PayPal支付对接背景:香港PC商城接入PayPal支付。
支付流程1、当点击PayPal 按钮的时候,会触发js的CreateOrder函数,调用Create Payment(pyament.php)后台的URL。
2、在调用Create Payment 后台的URL上,调用PayPal Create Payment API。调用API 请求(https://developer.paypal.com/docs/api/payments/v1/#payment_create)
3、返回token(res.token)。到这里整个Create Order函数结束,如果API调用成功,会弹窗并跳转到PayPal登陆页面。
4、PayPal登陆以后,点击付款按钮时,会触发onApprove方法。
5、传payment id,token, payer id给Execute Payment(successful.php)后台的URL。这个url是在调用Create Payment的时候设置的return_url
6、在Execute Payment后台的URL上调用PayPal的 Execut ...
PHPstorm设置背景图片
PHPstorm设置背景图片
使用快捷键方式弹出命令搜索框,选择 Set Background Image 命令, 会弹出设置框,选择图片即可。
弹出命令搜索框方法:
1、连续按2次shift键,在弹出的界面选择 Actions
2、ctrl + shift + A
PHP 数组排序函数 sort 底层实现分析
PHP 数组排序函数 sort 底层实现分析
PHP源码 github 仓库地址:https://github.com/php/php-src
源码路径:
ext\standard\array.cZend\zend_hash.hZend\zend_sort.c
ext\standard\array.c
Zend\zend_hash.h
Zend\zend_sort.c
从上面源码可以看出,sort 函数当排序的数组元素小于等于 16 个时,采用插入排序的方式进行排序;大于 16 个元素时,采用快速排序的方式。
当元素个数小于等于 5 个时,直接使用定义的函数进行简单排序交换。