小程序前端上传文件不建议直接引用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的更多相关文章

  1. 微信小程序上传文件遇到的坑

    在开发小程序时,使用的花生壳做的内网映射,域名使用花生壳卖的https域名 在做小程序文件上传时,调用接口,老是报错. Caused by: org.apache.commons.fileupload ...

  2. 微信小程序上传文件时弹出当前系统代理不是安全代理,是否信任

    我的开发环境是.net core 启用了https,而微信的开发者工具不认这个证书. 解决办法1:关闭https 然后在 Startup.cs 中关闭注释掉 app.UseHttpsRedirecti ...

  3. 微信小程序上传文件

    wx.chooseImage({ count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourc ...

  4. 微信小程序上传Excel文本文件功能

    问题: 在开发过程中会发现微信小程序有很多功能都还不能满足我们的需求,谁叫客户就是上帝呢,前几天小编遇到了这么个问题,就是用微信小程序上传文件,但是还以为微信带有这个模块,可是查了许久还是没有找到,只 ...

  5. 微信小程序上传多张图片,及php后台处理

    微信小程序上传多张图片,级小程序页面布局直接来代码index.wxml <view class='body' style='width:{{windowWidth}}px;height:{{wi ...

  6. 微信小程序上传与下载文件

    需要准备的工作: ①.建立微信小程序工程,编写以下代码. ②.通过IDE建立springboot+web工程,编写接收文件以及提供下载文件的方式,并将上传的文件相关信息记录在mysql数据库中.具体请 ...

  7. 微信小程序上传后发布或者体验版测试无数据解决办法

    在做微信小程序开发的过程中,发现小程序在本地调用接口的数据都显示,但是上传之后,发现手机体验没有数据.以下为解决办法: 1.先清除缓存试试. 2.打开微信小程序工具右上角的详情——项目设置,将“不校验 ...

  8. 微信小程序-上传照片-多张显示

    图片就是一个简单的效果 实现 先看wxml和wxss代码 <view class='in-demand'> <view class='dema-title'> <text ...

  9. 微信小程序上传一或多张图片

    一.要点 1.选取图片 wx.chooseImage({ sizeType: [], // original 原图,compressed 压缩图,默认二者都有 sourceType: [], // a ...

随机推荐

  1. Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本

    title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...

  2. Spring Cloud Gateway实战之五:内置filter

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. PAT A1107——并查集

     Social Clusters When register on a social network, you are always asked to specify your hobbies in ...

  4. [cf1103E]Radix sum

    类似于uoj272,即$B=10$的情况,然后有以下几个细节问题: 1.答案对$2^{58}$取模可以先使用自然溢出模$2^{64}$,最后对$2^{58}$取模即可 2.为了避免实数,令$\omeg ...

  5. [bzoj3329]Xorque

    首先将问题转化为2x^x=3x,那么相当于让x右移一位和原数的1不相交,即不含有相邻的1,第一个问题可以直接数位dp,第二个问题可以类似dp+矩乘优化即可 1 #include<bits/std ...

  6. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  7. 洛谷 P6478 - [NOI Online #2 提高组] 游戏(二项式反演+树形 dp)

    题面传送门 没错这就是我 boom0 的那场 NOIOL 的 T3 一年前,我在 NOIOL #2 的赛场上折戟沉沙,一年后,我从倒下的地方爬起. 我成功了,我不再是从前那个我了 我们首先假设 A 拥 ...

  8. python-django-查询详解

    倒数第二条性质可以实现链式的调用,通过第一次的过滤还可以再过滤倒数第一条就是结果集从数据库中查询出来之后不会再进行数据库的查询的我们使用的object就是模型管理器manager的一个对象 obj = ...

  9. BAT的一些题

    114.java中实现多态的机制是什么 答:重写,重载.方法的重写Overriding和重载Overloading是Java多态性的不同表现.  重写Overriding是父类与子类之间多态性的一种表 ...

  10. UE4之Slate: SImage

    概述 距离上次记录<UE4之Slate:纯C++工程配置>后已经好长时间了: 这个随笔来记录并分享一下SImage控件的使用,以在屏幕上显示一张图片: 目标 通过SImage控件的展示,学 ...