Taro 微信小程序 上传文件到minio
小程序前端上传文件不建议直接引用minio的js npm包,一来是这个包本身较大,会影响小程序的体积,二来是ak sk需要放到前端存储,不够安全,因此建议通过请求后端拿到签名数据后上传。
由于小程序的uploadFile仅支持POST请求(估计以后也不会支持PUT了),因此只能使用minio的PresignedPostPolicy方法返回签名后的formData,然后再放到小程序的uploadFile方法的formData参数中
后端 .net
安装minio nuget包
接口返回dto
public class UploadInfo
{
public string Key { get; set; }
public string Url { get; set; }
public Dictionary<string, string> FormData { get; set; }
}
多个key进行预签名, 注意new MinioClient的第一个参数是minio的服务器地址,不能有http://或https://, 如果是https则需要new 之后再调用.WithSSL(),参见官方文档。 当然最佳实践还是要将minioClient对象通过依赖注入管理,minio相关配置通过IConfiguration(appsettings.json)来管理。
public async Task<UploadInfo[]> PresignedPostPolicyAsync(string[] keys)
{
string bucket = "myBucket";
var minioClient = new MinioClient("myminio.com:9000",
"ak",
"sk"
);
var result = new UploadInfo[keys.Length];
for (int i = 0; i < keys.Length; i++)
{
var policy = new PostPolicy();
policy.SetKey(keys[i]);
policy.SetBucket(bucket);
policy.SetExpires(DateTime.UtcNow.AddHours(2));//设置策略过期时间
Tuple<string, Dictionary<string, string>> data = await minioClient.PresignedPostPolicyAsync(policy);
result[i] = new UploadInfo
{
Key = keys[i],
Url = $"{data.Item1}{bucket}/{keys[i]}",
FormData = data.Item2,
};
}
return result;
}
后端 java
dto
import java.util.Map;
import lombok.Data; @Data
public class Upload {
private String key;
private String url;
private Map<String, String> formData;
}
多个key进行预签名, 和.net sdk不一样的地方在于minio 服务器地址需要加上http, 还有可以设置上传条件,如 addEqualsCondition("key", key),表示key必须为对应的值, addStartsWithCondition("content-type","image/") 表示content-type必须以image/开头,也就是只能上传图片。
public List<Upload> uploadFiles(String[] keys)
throws IOException, NoSuchAlgorithmException, InvalidKeyException {
List<Upload> uploads = new ArrayList<>();
String bucket = "myBucket";
String endPoint = "http://myminio.com:9000";
try {
MinioClient minioClient =
MinioClient.builder()
.endpoint(endPoint)
.credentials("ak", "sk")
.build();for (int i = 0; i < jsonArray.size(); i++) {
Upload upload = new Upload();
String key = keys[i];
PostPolicy policy = new PostPolicy(bucket, ZonedDateTime.now().plusHours(2));
policy.addEqualsCondition("key", key);
Map<String, String> formData = minioClient.getPresignedPostFormData(policy);
String url = endPoint + "/" + bucket +"/" + key;
upload.setKey(key);
upload.setUrl(url);
upload.setFormData(formData);
uploads.add(upload);
}
}catch (MinioException e) {
System.out.println("Error occurred: " + e);
}
return uploads;
}
小程序
Taro代码如下,如果是原生微信小程序则把Taro换为wx即可。 注意uploadFile参数里 name需要设置为file, formData里设置key为policy签名的key。 上传成功minio会返回204
1 let minioUrl = 'https://myminio.com:9000'
2 let minioPresignUrl = 'https://myminio.com:8000/files/presign';
3 Taro.chooseImage({
4 count: 1,
5 sizeType: ["original", "compressed"],
6 sourceType: ["album", "camera"],
7 success: async res=>{
8 let result = await Taro.request({url: minioPresignUrl, data: {keys:[res.tempFilePaths[0]]}});
9 result.data.data.forEach(f => {
10 f.formData.key = f.key;
11 Taro.uploadFile({
12 filePath:res.tempFilePaths[0] ,
13 name: "file",
14 url: minioUrl,
15 formData: f.formData,
16 success: r => {
17 if (r.statusCode === 204) {
18 console.log('上传成功');
19 }
20 }
21 });
22 })
23 }
24 })
Taro 微信小程序 上传文件到minio的更多相关文章
- 微信小程序上传文件遇到的坑
在开发小程序时,使用的花生壳做的内网映射,域名使用花生壳卖的https域名 在做小程序文件上传时,调用接口,老是报错. Caused by: org.apache.commons.fileupload ...
- 微信小程序上传文件时弹出当前系统代理不是安全代理,是否信任
我的开发环境是.net core 启用了https,而微信的开发者工具不认这个证书. 解决办法1:关闭https 然后在 Startup.cs 中关闭注释掉 app.UseHttpsRedirecti ...
- 微信小程序上传文件
wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourc ...
- 微信小程序上传Excel文本文件功能
问题: 在开发过程中会发现微信小程序有很多功能都还不能满足我们的需求,谁叫客户就是上帝呢,前几天小编遇到了这么个问题,就是用微信小程序上传文件,但是还以为微信带有这个模块,可是查了许久还是没有找到,只 ...
- 微信小程序上传多张图片,及php后台处理
微信小程序上传多张图片,级小程序页面布局直接来代码index.wxml <view class='body' style='width:{{windowWidth}}px;height:{{wi ...
- 微信小程序上传与下载文件
需要准备的工作: ①.建立微信小程序工程,编写以下代码. ②.通过IDE建立springboot+web工程,编写接收文件以及提供下载文件的方式,并将上传的文件相关信息记录在mysql数据库中.具体请 ...
- 微信小程序上传后发布或者体验版测试无数据解决办法
在做微信小程序开发的过程中,发现小程序在本地调用接口的数据都显示,但是上传之后,发现手机体验没有数据.以下为解决办法: 1.先清除缓存试试. 2.打开微信小程序工具右上角的详情——项目设置,将“不校验 ...
- 微信小程序-上传照片-多张显示
图片就是一个简单的效果 实现 先看wxml和wxss代码 <view class='in-demand'> <view class='dema-title'> <text ...
- 微信小程序上传一或多张图片
一.要点 1.选取图片 wx.chooseImage({ sizeType: [], // original 原图,compressed 压缩图,默认二者都有 sourceType: [], // a ...
随机推荐
- 问题 O: 寻找最大数(三)
[提交][状态][讨论版] 题目描述 给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数. 求这个新的整数的最大值是多少. 输入 多组测试数据. 每组测试数据占一行,每行 ...
- Linux基础五:网络配置与管理
五.网络配置与管理 1.网络知识 2.命令 ifconfig命令 <=> ip addr show 命令--查看本地所有网卡配置信息 ens32:本地以太网网卡,lo:本地回环网卡 ...
- 大爽Python入门教程 0-4 安装Pycharm
大爽Python入门公开课教案 点击查看教程总目录 安装重量级IDE--Pycharm 一 下载 下面步骤1,2中网络卡顿的朋友, 请直接前往步骤3来下载. 使用搜索引擎搜索Pycharm, 打开搜索 ...
- Java设计模式之(三)——建造者模式
1.什么是建造者模式 Separate the construction of a complex object from its representation so that the same co ...
- html+css第七篇-表格
表格标签: table 表格 thead 表格头 tbody 表格主体 tfoot 表格尾 tr 表格行 th 元素定义表头 td 元素定义表格单元 表格样式重置 table{border-colla ...
- 从一个小Bug,到Azure DevOps
1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...
- 华为云企业级Redis评测第一期:稳定性与扩容表现
摘要:采用Redis Labs推出的多线程压测工具memtier_benchmark对比测试下GaussDB(for Redis) 和原生Redis的特性差异. 本文分享自华为云社区<华为云企业 ...
- NOIp2021 原地退役记
JS-0013 Day -2 - 2021.11.17 打了场 cmd_blk 出的模拟赛,T2 T3 都是做过的原题(AGC010C & ARC092D),于是直接摆烂交暴力垫底,成功为我的 ...
- a.out的由来
用过linux的都知道,在linux下编译链接程序,如果不加-o参数,生成的binary代码的名字都是默认的a.out.一不小心,a.out还会覆盖上次其他code生成的binary代码. a.out ...
- IO流中的字符输入输出流及try...catch处理流处理中的异常
使用字节流读取中文的问题 import java.io.FileInputStream; import java.io.IOException; /* 使用字节流读取中文文件 1个中文 GBK:占用两 ...