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 ...
随机推荐
- loto示波器实践——超声波测距模块
我们这里用到的超声波测距模块,一般是用于arduino智能小车自动避障的.经常见到的应用是使用单片机或者stm32和这种模块结合进行开发的. 我们使用LOTO示波器可以更直观和快速的看到超声波测量距离 ...
- 菜鸡的Java笔记 第三十六 - java 函数式编程
StudyLambda Lambda 指的是函数式编程,现在最为流行的编程模式为面向对象,很多的开发者并不认可面向对象,所以很多的开发者宁愿继续使用 C 语言进行开发,也不愿意使用java,c+ ...
- ICCV2021 | Vision Transformer中相对位置编码的反思与改进
前言 在计算机视觉中,相对位置编码的有效性还没有得到很好的研究,甚至仍然存在争议,本文分析了相对位置编码中的几个关键因素,提出了一种新的针对2D图像的相对位置编码方法,称为图像RPE(IRPE). ...
- [bzoj5343]混合果汁
二分枚举答案,问题转化为计算至少取到一定体积,价格最少是多少,显然是贪心取最小,用线段树维护,然后因为要判断答案,所以可持久化一下即可. 1 #include<bits/stdc++.h> ...
- [loj3330]猜数游戏
如果两个数$a_{x}$和$a_{y}$,$\exists 0<i,a_{x}^{i}\equiv a_{y}(mod\ p^{k})$,就建一条$x$到$y$的有向边,再对这张图强连通分量缩点 ...
- 论文解读(node2vec)《node2vec Scalable Feature Learning for Networks》
论文题目:<node2vec Scalable Feature Learning for Network>发表时间: KDD 2016 论文作者: Aditya Grover;Adit ...
- 待办事项-redis
package com.easyagu.liwei.util;import redis.clients.jedis.BinaryClient;import redis.clients.jedis.Je ...
- flutter第一课
网上搜到有一个8小时体验flutter的教程,感觉可以尝试一个hello world出来:https://www.jianshu.com/p/9aaabc60d8af 官网下载很慢,可以使用镜像下载, ...
- Jmeter——变量嵌套函数使用(__V)案例分析
jmeter版本:5.3 __V官方函数解释: (https://jmeter.apache.org/usermanual/functions.html#__V) 图1-1 解决问题:实现字符串拼接 ...
- Codeforces 917C - Pollywog(状压 dp+矩阵优化)
UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...